将 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