Camel将正文设置为具有标头表达式的对象

bnl4lu3b  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(143)

有没有可能设置一个对象的响应体,并传入一个camel头属性。我可以在处理器中实现这一点,但我宁愿在路由线上做。

.setBody(constant(
        new Foo()
        .withOne("HelloWorld")
        .withTwo(simple("Header property is ${header.uniqueProperty}").toString())
))

使用上面的代码,我得到的响应为:

<foo>
  <one>HelloWorld</one>
  <two>Header property is ${header.uniqueProperty}</two>
</foo>

这是我的POJO

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

    private String one;
    private String two;

    public String getOne() {
    return one;
    }

    public void setOne(final String one) {
    this.one = one;
    }

    public String getTwo() {
    return two;
    }

    public void setTwo(final String two) {
    this.two = two;
    }

    public Foo withOne(final String one) {
    setOne(one);
    return this;
    }

    public Foo withTwo(final String two) {
    setTwo(two);
    return this;
    }
}
ruarlubt

ruarlubt1#

constant()可能不适合您,因为您可能希望对每个经过的交换进行动态评估。由于您需要将body设置为新示例化的对象,因此您需要一种能够实现此功能的机制。您提到您希望避免处理器,但我想指出在路由中完成此操作是多么简单:

.setBody(exchange -> new Foo()
        .withOne("HelloWorld")
        .withTwo(simple("Header property is " + exchange.getIn().getHeader("uniqueProperty")))
)

编辑:实际上这不是一个处理器,我们只是传递一个lambda(Function)给setBody()
如果您在Spring环境中,则可以使用Spring表达式语言:

.setBody().spel("#{new Foo()" +
    ".withOne('HelloWorld')" +
    ".withTwo(simple('Header property is ' + request.headers.uniqueProperty))}");

相关问题