将 object 参数传递给 setHeader 中的方法 - 骆驼
pass object parameter to method in setHeader - camel
我是 Camel 的新手,正在尝试找到一种方法将 object 传递给 SetHeader 中的方法。
但是我收到一个错误,
org.apache.camel.language.bean.RuntimeBeanExpressionException: Failed to invoke method: getCustProcessDir('${header.CUST}') on null due to: org.apache.camel.component.bean.ParameterBindingException: Error during parameter binding on method: public java.lang.String CustDao.getCustProcessDir(Cust) at parameter #0 with type: class Cust with value type: class java.lang.String and value: Cust@199b87b5
at org.apache.camel.language.bean.BeanExpression.invokeOgnlMethod(BeanExpression.java:430) ~[camel-bean-3.3.0.jar:3.3.0]
at org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:164) ~[camel-bean-3.3.0.jar:3.3.0]
代码:
fromF("file:C:/Users/a/Documents/Development/input/"
+ "?recursive=false&noop=true&delay=20000&readLockLoggingLevel=WARN&shuffle=true"
+ "&readLock=idempotent&idempotentRepository=#fileRepo&readLockRemoveOnCommit=true&readLockRemoveOnRollback=true&delete=true&moveFailed=%s"
, "C:/Users/a/Documents/Development/rejected/")
.routeId("fileMoveRoute")
.process(exchange -> {
exchange.getMessage().setHeader("Application_ID", appInfo.getInstanceId());
})
.threads(appInfo.getThreadCount())
.setHeader("CUST", method(CustDao.class, "getInboundCustWithfile('${header.CamelFilePath}')"))
.setHeader("PROCESS_DIR", method(CustDao.class, "getCustProcessDir('${header.CUST}')"))
...
public String getCustProcessDir(Cust cust) {
return appInfo.getDir() + cust.getCustprofid() + "/hold/";
}
public class Cust {
private int custid;
private String custprofid;
...
}
第一个 setHeader("CUST"..)
有效,我相信 Header("CUST")
已返回 object 个值。
但我不确定它是如何存储在 Camel 中的。我试图在调试期间从变量 window 中找到它们,但无法找到它们。太多的变量需要研究...在调试期间我在哪里可以找到这个 Header 值?
以及如何将 object 值传递给该方法?
.setHeader("PROCESS_DIR", method(CustDao.class, "getCustProcessDir('${header.CUST}')"))
或者在路由过程中有更好的方法pass/handle object?
谢谢,
我猜 单引号 围绕 ${header.CUST}
这样的表达式是问题所在,因为 RuntimeBeanExpressionException
抱怨它收到的是字符串 Cust@199b87b5
Cust
对象。
看看 Camel docs for Bean binding。方法参数表达式周围没有单引号。
关于header变量的存储:存储在Camel的Message object
Exchange -> Message -> Headers
Exchange -> ExchangeProperties
我是 Camel 的新手,正在尝试找到一种方法将 object 传递给 SetHeader 中的方法。
但是我收到一个错误,
org.apache.camel.language.bean.RuntimeBeanExpressionException: Failed to invoke method: getCustProcessDir('${header.CUST}') on null due to: org.apache.camel.component.bean.ParameterBindingException: Error during parameter binding on method: public java.lang.String CustDao.getCustProcessDir(Cust) at parameter #0 with type: class Cust with value type: class java.lang.String and value: Cust@199b87b5
at org.apache.camel.language.bean.BeanExpression.invokeOgnlMethod(BeanExpression.java:430) ~[camel-bean-3.3.0.jar:3.3.0]
at org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:164) ~[camel-bean-3.3.0.jar:3.3.0]
代码:
fromF("file:C:/Users/a/Documents/Development/input/"
+ "?recursive=false&noop=true&delay=20000&readLockLoggingLevel=WARN&shuffle=true"
+ "&readLock=idempotent&idempotentRepository=#fileRepo&readLockRemoveOnCommit=true&readLockRemoveOnRollback=true&delete=true&moveFailed=%s"
, "C:/Users/a/Documents/Development/rejected/")
.routeId("fileMoveRoute")
.process(exchange -> {
exchange.getMessage().setHeader("Application_ID", appInfo.getInstanceId());
})
.threads(appInfo.getThreadCount())
.setHeader("CUST", method(CustDao.class, "getInboundCustWithfile('${header.CamelFilePath}')"))
.setHeader("PROCESS_DIR", method(CustDao.class, "getCustProcessDir('${header.CUST}')"))
...
public String getCustProcessDir(Cust cust) {
return appInfo.getDir() + cust.getCustprofid() + "/hold/";
}
public class Cust {
private int custid;
private String custprofid;
...
}
第一个 setHeader("CUST"..)
有效,我相信 Header("CUST")
已返回 object 个值。
但我不确定它是如何存储在 Camel 中的。我试图在调试期间从变量 window 中找到它们,但无法找到它们。太多的变量需要研究...在调试期间我在哪里可以找到这个 Header 值?
以及如何将 object 值传递给该方法?
.setHeader("PROCESS_DIR", method(CustDao.class, "getCustProcessDir('${header.CUST}')"))
或者在路由过程中有更好的方法pass/handle object?
谢谢,
我猜 单引号 围绕 ${header.CUST}
这样的表达式是问题所在,因为 RuntimeBeanExpressionException
抱怨它收到的是字符串 Cust@199b87b5
Cust
对象。
看看 Camel docs for Bean binding。方法参数表达式周围没有单引号。
关于header变量的存储:存储在Camel的Message object
Exchange -> Message -> Headers
Exchange -> ExchangeProperties