2014-10-22 91 views
1

我有一个使用Velocity模板骆驼路线和在体内我有一个对象定义如下:骆驼Velocity模板 - 访问Java对象属性

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} )。

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

回答

2

您可以通过设置消息头"CamelVelocityContext"(自骆驼v2.14以来)设置自定义Velocity上下文。从骆驼的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.