Camel Werfen MethodNotFound für die Methode, die existiert und ist public
Teste ich ein Kamel Runde, aber wenn ich die Strecke versuchen, auf eine bestimmte Methode in einer bean-es wird immer behauptet, dass es keine solche Methode gefunden. Quelle:
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;
}
}
}
Die route ist wie folgt:
public class CommunicatorRoute extends RouteBuilder
{
@Override
public void configure() throws Exception
{
from("seda:messagesFound").bean("converter", "processMessage");
}
}
Ausnahme ist wie folgt:
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.Komponente.bean.MethodNotFoundException: Methode mit dem Namen: processMessage nicht gefunden bean: converter. Exchange[Meldung: com.saic.jswe.common.cdif.message.Message@f593af]
Ich bin noch ziemlich neu in camel also, wenn ich mache etwas wirklich einfachen Fehler lassen Sie es mich bitte wissen.
- im nicht sicher, wie camel Suche nach Methoden, aber könnte sein, dass es gesucht wird eine Methode mit verschiedenen Parametern. Wie processMessage(Körper, Nachricht) oder so ähnlich
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du Klasse private static. Es muss public static so Camel zugreifen kann.
So, ich habe dies aus und es war ein einfacher Fehler. Die routebuilder verwendet die Linie
from("seda:messagesFound").bean("converter", "processMessage");
das hat nicht funktioniert. ABER durch die änderung der route zufrom("seda:messagesFound").beanref("converter", "processMessage");
und (wie von Claus erwähnt verändert der Zugang zum öffentlichen auf die innere Klasse) funktionierte es gut. Ändern Sie einfach die Klasse, um den öffentlichen statt privaten änderungen, die nur den Fehler, wie es scheint.Der Kern des Problems ist, dass die .bean () - Methode sieht nicht bei der Registrierung, so dass, wenn ich ging es
converter
ich dachte, ich gab Ihr den Namen der bean zu verwenden, aber nur .bean () - Variante, die passt, istpublic Type bean(Object bean, String method)
. Also, natürlich, Kamel konnte nicht finden, dass die Methode: Es wurde versucht zu finden, die Methode "processMessage -" nicht in meinem Konverter, sondern auch aus der Zeichenfolge, die ich es übergeben.