在 Apache 骆驼中如何调用 bean 方法?
How bean method is called in Apache camel?
这是我的豆子
package beans;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class setFileNames {
public String getCityName(Document document) {
NodeList cities = document.getDocumentElement().getElementsByTagName(
"city");
Element city = (Element) cities.item(0);
String textContent = city.getTextContent();
return textContent+".xml";
}
}
这是我的路线
public void configure ( ) throws java .lang .Exception {
from ( uril1ap .get ("Sender cFile 1") ).routeId ( "Sender_cFile_ l").split()
.xpath ( "/ people/ person") .id ( "cSplitter_ l")
.setHeader ( "CamelFileName") .method ( beans.setFileNames.class)
.id ( "cSetHeader_ l") .to ( uril1ap .get ( "Receiver_cFile_2") )
.id ( "cFile_2") .process ( new org .apache .camel . Processor ( )
{ public void process ( org .apache .carnel .Exchange exchange)
throws Exception {
System .out .println ( "File rece ived : "
+ exchange .getIn ().getHeader ( "CamelFileName") ) ;
}) .id ( "cProcessor_ l");
您可能会发现上述路由中存在一些语法问题,但它工作正常(此处复制了不准确的代码)
想知道,正如我们所见CamelFileName
bean被路由使用,它是class setFileNames
的一个实例,但是它如何调用getCityName
它在路线中的方法?路由如何知道调用和打印哪个方法?
调用Bean的就是这条语句:
.method ( beans.setFileNames.class)
尽管您的参数有点奇怪,但您有多种选择将什么传递给 method
语句。
最常见的是
- 一个Class
.method(MyBean.class)
- 在路由 class
中创建的 bean 实例 .method(myBean)
- 按名称
.method("myBean")
如果 Bean 已在应用程序上下文中注册
方法 selection 在您的情况下非常简单,因为只有一种方法。
但是,Camel 有一个相当“精细”的算法select Bean 中最合适的方法class。
如果此算法 select 是错误的方法,您可以按名称显式调用该方法:.method(MyBean.class, "myMethod")
据我所知,Camel 在 class 中调用了 public 方法,在这种情况下,它还将其参数 Document
推断为消息正文,因为没有注释(例如@Header、@ExchangeProperty 等)已绑定到参数。
但是,如果您的 bean class 有多个 public 方法,Camel 会尝试调用其参数与消息正文类型相匹配的方法。通过找到参数具有相同类型的多个 public 方法,然后由于歧义问题抛出运行时异常。
正如@burki 提到的,您可以在路由中指明要调用的方法。但是您也可以通过使用 @Handler
.
注释将 bean class 中的一个方法标记为默认方法
这是我的豆子
package beans;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class setFileNames {
public String getCityName(Document document) {
NodeList cities = document.getDocumentElement().getElementsByTagName(
"city");
Element city = (Element) cities.item(0);
String textContent = city.getTextContent();
return textContent+".xml";
}
}
这是我的路线
public void configure ( ) throws java .lang .Exception {
from ( uril1ap .get ("Sender cFile 1") ).routeId ( "Sender_cFile_ l").split()
.xpath ( "/ people/ person") .id ( "cSplitter_ l")
.setHeader ( "CamelFileName") .method ( beans.setFileNames.class)
.id ( "cSetHeader_ l") .to ( uril1ap .get ( "Receiver_cFile_2") )
.id ( "cFile_2") .process ( new org .apache .camel . Processor ( )
{ public void process ( org .apache .carnel .Exchange exchange)
throws Exception {
System .out .println ( "File rece ived : "
+ exchange .getIn ().getHeader ( "CamelFileName") ) ;
}) .id ( "cProcessor_ l");
您可能会发现上述路由中存在一些语法问题,但它工作正常(此处复制了不准确的代码)
想知道,正如我们所见CamelFileName
bean被路由使用,它是class setFileNames
的一个实例,但是它如何调用getCityName
它在路线中的方法?路由如何知道调用和打印哪个方法?
调用Bean的就是这条语句:
.method ( beans.setFileNames.class)
尽管您的参数有点奇怪,但您有多种选择将什么传递给 method
语句。
最常见的是
- 一个Class
.method(MyBean.class)
- 在路由 class 中创建的 bean 实例
- 按名称
.method("myBean")
如果 Bean 已在应用程序上下文中注册
.method(myBean)
方法 selection 在您的情况下非常简单,因为只有一种方法。
但是,Camel 有一个相当“精细”的算法select Bean 中最合适的方法class。
如果此算法 select 是错误的方法,您可以按名称显式调用该方法:.method(MyBean.class, "myMethod")
据我所知,Camel 在 class 中调用了 public 方法,在这种情况下,它还将其参数 Document
推断为消息正文,因为没有注释(例如@Header、@ExchangeProperty 等)已绑定到参数。
但是,如果您的 bean class 有多个 public 方法,Camel 会尝试调用其参数与消息正文类型相匹配的方法。通过找到参数具有相同类型的多个 public 方法,然后由于歧义问题抛出运行时异常。
正如@burki 提到的,您可以在路由中指明要调用的方法。但是您也可以通过使用 @Handler
.