Domanda

I'm testing a camel round but when I have the route try to access a particular method in a bean it keeps saying that there is no such method found. Source:

public class CommunicatorTest
{
    FakeMessageConverter converter;
    CamelContext context;
    ProducerTemplate template;
    String producerEndpoint = "seda:messagesFound";
    long test = 123456789;

    static final Logger logger = Logger.getLogger(CommunicatorTest.class);

    public CommunicatorTest()
    {

    }

    @Before
    public void setUp() throws Exception
    {
        converter = new FakeMessageConverter();
        SimpleRegistry registry = new SimpleRegistry();
        registry.put("converter", converter);
        context = new DefaultCamelContext(registry);
        template = context.createProducerTemplate();
        context.addRoutes(new CommunicatorRoute());

        logger.info("Done creating context");

        context.start();
    }

    @After
    public void tearDown() throws Exception
    {
        context.stop();
    }


    @Test
    public void testExistanceOfBean()
    {
        Object lookup = context.getRegistry().lookup("converter");
        assertTrue("Object not a MessageConverter", lookup instanceof FakeMessageConverter);
    }

    @Test
    public void testRoute()
    {
        Message msg = new Message();
        msg.setHeader(new MessageHeader());
        msg.getHeader().setSourceId(test);

        logger.info("Sending data");
        template.sendBody(producerEndpoint, msg);


        assertEquals("value not the same", test, converter.getSid());
        logger.info("Done Sending");
    }

    private static class FakeMessageConverter
    {

        private long sid;
        private boolean edited = false;

        public FakeMessageConverter()
        {
        }

        public void processMessage(Message msg)
        {
            sid = msg.getHeader().getSourceId();
            edited = true;
            logger.info("The sid"+sid);
        }

        /**
         * @return the sid
         */
        public long getSid()
        {
            return sid;
        }

        /**
         * @param sid the sid to set
         */
        public void setSid(long sid)
        {
            this.sid = sid;
        }
    }

}

The route is as follows:

public class CommunicatorRoute extends RouteBuilder
{

    @Override
    public void configure() throws Exception
    {
        from("seda:messagesFound").bean("converter", "processMessage");
    }

}

The exception is as follows:

ERROR [org.apache.camel.component.seda.SedaConsumer] - Error processing exchange. Exchange[Message: net.package.Message@f593af]. Caused by: [org.apache.camel.component.bean.MethodNotFoundException - Method with name: processMessage not found on bean: converter. Exchange[Message: net.package.message.Message@f593af]]

org.apache.camel.component.bean.MethodNotFoundException: Method with name: processMessage not found on bean: converter. Exchange[Message: com.saic.jswe.common.cdif.message.Message@f593af]

I'm still fairly new to camel so if I'm making some really simple mistake please let me know.

È stato utile?

Soluzione 2

So I figured this out and it was a simple error. The routebuilder used the line from("seda:messagesFound").bean("converter", "processMessage"); which didn't work. BUT by changing the route to from("seda:messagesFound").beanref("converter", "processMessage"); and (as Claus mentions changing the access to public on the inner class) it worked fine. Just changing the class to public instead of private only changes the error it would seem.

The crux of the issue is that the .bean() method doesn't look at the registry, so when I passed it converter I thought I was giving it the name of the bean to use, but the only .bean() variation that fits is public Type bean(Object bean, String method). So of course camel couldn't find the method: It was trying to find the method "processMessage" not in my converter but in the very string I passed it.

Altri suggerimenti

You class is private static. It must be public static so Camel can access it.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top