передать параметр объекта методу в setHeader — camel

#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. Очень хороший улов! имеет смысл. не знаю, почему я этого не видел 😉 Я действительно ценю!