2

我正在测试骆驼回合,但是当我有路由尝试访问 bean 中的特定方法时,它一直说没有找到这样的方法。来源:

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;
        }
    }

}

路线如下:

public class CommunicatorRoute extends RouteBuilder
{

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

}

例外情况如下:

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:方法名称:在 bean 上找不到 processMessage:转换器。交流[留言:com.saic.jswe.common.cdif.message.Message@f593af]

我对骆驼还很陌生,所以如果我犯了一些非常简单的错误,请告诉我。

4

2 回答 2

2

你的类是私有静态的。它必须是公共静态的,以便 Camel 可以访问它。

于 2012-09-17T18:54:59.417 回答
0

所以我想通了,这是一个简单的错误。路由构建器使用了不起作用的行from("seda:messagesFound").bean("converter", "processMessage");。但是通过改变路由from("seda:messagesFound").beanref("converter", "processMessage");和(正如克劳斯提到改变内部类对公共的访问)它工作得很好。只需将类更改为 public 而不是 private 只会改变它看起来的错误。

问题的症结在于 .bean() 方法不查看注册表,所以当我传递它时,converter我以为我给它的是要使用的 bean 的名称,但唯一适合的 .bean() 变体是public Type bean(Object bean, String method)。所以当然骆驼找不到方法:它试图找到方法“processMessage”,而不是在我的转换器中,而是在我传递的字符串中。

于 2012-09-19T13:20:22.857 回答