#apache-camel
#apache-camel
Вопрос:
Я новичок в Camel и пытаюсь найти способ передать объект методу в 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=falseamp;noop=trueamp;delay=20000amp;readLockLoggingLevel=WARNamp;shuffle=true"
"amp;readLock=idempotentamp;idempotentRepository=#fileRepoamp;readLockRemoveOnCommit=trueamp;readLockRemoveOnRollback=trueamp;delete=trueamp;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")
он вернул значения объекта.
но я не уверен, как он хранится в Camel. Я пытался найти их в окне переменных во время отладки, но не смог их найти. слишком много переменных для изучения… Где я могу найти значения этого заголовка во время отладки?
и как я могу передать значения объекта в метод?
.setHeader("PROCESS_DIR", method(CustDao.class, "getCustProcessDir('${header.CUST}')"))
или есть лучший способ передать / обработать объект во время маршрутизации?
Спасибо,
Ответ №1:
Я предполагаю, что одинарные кавычки вокруг выражений, подобных ${header.CUST}
, являются проблемой, потому RuntimeBeanExpressionException
что жалуется, что он получает строку Cust@199b87b5
вместо Cust
объекта.
Взгляните на документы Camel для привязки компонентов. Вокруг выражений параметров метода нет одинарных кавычек.
О хранении переменных заголовка: они хранятся в объекте сообщения Camel.
Exchange -> Message -> Headers
Exchange -> ExchangeProperties
Комментарии:
1. Очень хороший улов! имеет смысл. не знаю, почему я этого не видел 😉 Я действительно ценю!