Camel Velocity Template - 访问java对象属性

时间:2014-10-22 10:04:25

标签: apache-camel velocity

我有一个使用Velocity模板的驼峰路线,在体内我有一个对象定义如下:

class MailImpl extends AbstractMail{

    private BodyContext bodyContext;

    public BodyContext getBodyContext() {
        return bodyContext;
    }

    public void setBodyContext(BodyContext bodyContext) {
        this.bodyContext = bodyContext;
    }

    private String test;

    public String getTest() {
        return test;
    }

    public void setTest(String test) {
        this.test = test;
    }

    @Override
    public String toString() {
        return "MailImpl{" +
                "bodyContext=" + bodyContext +
                '}';
    }
}

class BodyContext{
    private String value;

    public BodyContext(String value) {
        this.value = value;
    }

    public BodyContext() {
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "BodyContext{" +
                "value='" + value + '\'' +
                '}';
    }

在速度模板中,我想访问MailImpl对象属性,例如我使用$ {body.test}和$ {body.bodyContext.value}但是速度模板不会转换这些值(它返回为字符串$ {body.test}和$ {body.bodyContext.value})。

一个解决方案可能是为模板中需要使用的每个值创建标题,但由于我的路由是动态的(我根据标题选择了速度模板)我想在速度上下文中访问body属性。这有可能吗?

1 个答案:

答案 0 :(得分:3)

您可以通过设置邮件标题"CamelVelocityContext"来设置自定义速度上下文(因为Camel v2.14)。来自Camel的test case

Map<String, Object> variableMap = new HashMap<String, Object>();
Map<String, Object> headersMap = new HashMap<String, Object>();
headersMap.put("name", "Willem");
variableMap.put("headers", headersMap);
variableMap.put("body", "Monday");
variableMap.put("exchange", exchange);
VelocityContext velocityContext = new VelocityContext(variableMap);
exchange.getIn().setHeader(VelocityConstants.VELOCITY_CONTEXT, velocityContext);
exchange.setProperty("item", "7");

使用以下模板:

Dear ${headers.name}. You ordered item ${exchange.properties.item} on ${body}.

你得到:

Dear Willem. You ordered item 7 on Monday.