Camel Throwing MethodNotFound для метода, который существует и является общедоступным

Я тестирую раунд верблюда, но когда у меня есть маршрут, пытающийся получить доступ к определенному методу в 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: метод с именем: processMessage не найден в bean: convert. Обмен[Сообщение: com.saic.jswe.common.cdif.message.Message@f593af]

Я все еще довольно новичок в верблюдах, поэтому, если я делаю какую-то действительно простую ошибку, пожалуйста, дайте мне знать.


person mja    schedule 17.09.2012    source источник
comment
Я не уверен, как верблюд ищет методы, но может быть, он ищет метод с другими параметрами. Например, processMessage(Body, Message) или что-то в этом роде.   -  person Plínio Pantaleão    schedule 17.09.2012


Ответы (2)


Ваш класс является частным статическим. Он должен быть общедоступным статическим, чтобы Camel мог получить к нему доступ.

person Claus Ibsen    schedule 17.09.2012
comment
На самом деле, я не уверен, как я не получил это раньше (на самом деле я знаю: Camel даже не смог найти метод), но это, похоже, вызывает ошибку вроде такой: «java.lang.IllegalAccessException: Class org. apache.camel.component.bean.MethodInfo не может получить доступ к члену класса. Фактическую причину см. ниже. - person mja; 19.09.2012

Итак, я понял это, и это была простая ошибка. Построитель маршрутов использовал строку from("seda:messagesFound").bean("converter", "processMessage");, которая не работала. НО, изменив маршрут на from("seda:messagesFound").beanref("converter", "processMessage"); и (как упоминает Клаус, изменив доступ к public во внутреннем классе), все заработало нормально. Простое изменение класса на общедоступный вместо частного только изменяет ошибку, которая может показаться.

Суть проблемы в том, что метод .bean() не просматривает реестр, поэтому, когда я передал его converter, я думал, что даю ему имя используемого компонента, но единственный вариант .bean(), который подходит public Type bean(Object bean, String method). Так что, конечно, верблюд не мог найти метод: он пытался найти метод «processMessage» не в моем конвертере, а в той самой строке, которую я ему передал.

person mja    schedule 19.09.2012