Apache Camel框架之Freemarker做数据转换

17 篇文章 0 订阅
11 篇文章 2 订阅

在做系统集成的时候,必不可少的任务就是将数据从一种格式转换为另一种格式,再把转换后的格式发到目标系统,在此用实例介绍一下Camel中利用Freemarker做数据转换.

1,Freemarker的模板如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <people xmlns:h="http://www.w3.org/TR/html4/">
  3. <#escape x as x?xml>
  4. <#list body.peopleList as p>
  5. <person id="000001" age="20">
  6. <name>
  7. <family>${p.fname}</family>
  8. <given>${p.gname}</given>
  9. </name>
  10. <email>${p.email}</email>
  11. <link manager="${p.manager}" />
  12. <#if p.level == "L1">
  13. <l1tag>xxx</l1tag>
  14. </#if>
  15. </person>
  16. </#list>
  17. </#escape>
  18. </people>
<?xml version="1.0" encoding="UTF-8"?>
<people  xmlns:h="http://www.w3.org/TR/html4/">
    <#escape x as x?xml>
    <#list body.peopleList as p>
    <person id="000001" age="20">
        <name>
            <family>${p.fname}</family>
            <given>${p.gname}</given>
        </name>
        <email>${p.email}</email>
        <link manager="${p.manager}" />
        <#if p.level == "L1">
        <l1tag>xxx</l1tag>
        </#if>
    </person>
    </#list>
    </#escape>
</people>

2,与之对应的Java对象如下:每一个person节点对应一个ValueObject放在XMLTemplateParameter的peopleList里面.

  1. public class XMLTemplateParameter {
  2. private String fileName;
  3. private List<ValueObject> peopleList = new ArrayList<ValueObject>();
  4. public List<ValueObject> getPeopleList() {
  5. return peopleList;
  6. }
  7. public void setPeopleList(List<ValueObject> peopleList) {
  8. this.peopleList = peopleList;
  9. }
  10. public String getFileName() {
  11. return fileName;
  12. }
  13. public void setFileName(String fileName) {
  14. this.fileName = fileName;
  15. }
  16. }
  17. public class ValueObject {
  18. private String fname;
  19. private String gname;
  20. private String email;
  21. private String manager;
  22. private String level;
public class XMLTemplateParameter {
    private String fileName;    
    private List<ValueObject> peopleList = new ArrayList<ValueObject>();

    public List<ValueObject> getPeopleList() {
        return peopleList;
    }
    public void setPeopleList(List<ValueObject> peopleList) {
        this.peopleList = peopleList;
    }
    public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
}
public class ValueObject {
    private String fname;
    private String gname;
    private String email;
    private String manager;
    private String level;

3,Route代码如下:

  1. public class CamelFreemarkerRoute extends RouteBuilder {
  2. public void configure() throws Exception {
  3. from("quartz://report?cron=10 * * * * ?&stateful=true")
  4. .beanRef("fmBean","prepareFMValues")
  5. .to("freemarker:com/test/camel/freemarker/test.ftl")
  6. .to("file:d:/temp/outbox?fileName=fm.xml");
  7. }
  8. }
public class CamelFreemarkerRoute extends RouteBuilder {
    public void configure() throws Exception {
        from("quartz://report?cron=10 * * * * ?&stateful=true")
        .beanRef("fmBean","prepareFMValues") 
        .to("freemarker:com/test/camel/freemarker/test.ftl")
        .to("file:d:/temp/outbox?fileName=fm.xml");    
    }
}

4,Route里用到的bean如下:xmlTemplateParameter做为顶级对象放在body里面,Freemarker里取数据的body.peopleList就对应于xmlTemplateParameter.peopleList

  1. public class FmProcessorBean {
  2. public void prepareFMValues(Exchange exchange){
  3. XMLTemplateParameter xmlTemplateParameter = new XMLTemplateParameter();
  4. ValueObject val = null;
  5. for(int i=0;i<3;i++){
  6. val = new ValueObject();
  7. val.setFname("Yao");
  8. val.setGname("Yorker" +i);
  9. val.setEmail("test@mail.com");
  10. val.setManager("m&an<ager");
  11. val.setLevel("L" + i);
  12. xmlTemplateParameter.getPeopleList().add(val);
  13. }
  14. exchange.getIn().setBody(xmlTemplateParameter);
  15. }
  16. }
public class FmProcessorBean {    
    public void prepareFMValues(Exchange exchange){
        XMLTemplateParameter xmlTemplateParameter = new XMLTemplateParameter();

        ValueObject val = null;
        for(int i=0;i<3;i++){
            val = new ValueObject();        
            val.setFname("Yao");
            val.setGname("Yorker" +i);
            val.setEmail("test@mail.com");
            val.setManager("m&an<ager");
            val.setLevel("L" + i);
            xmlTemplateParameter.getPeopleList().add(val);            
        }        
        exchange.getIn().setBody(xmlTemplateParameter);
    }    
}

5,Spring的配置文件如下:

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:camel="http://camel.apache.org/schema/spring"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  5. http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"
  6. default-autowire="byName" default-init-method="init">
  7. <bean id="fmBean" class="com.test.camel.freemarker.FmProcessorBean"/>
  8. <camelContext id="testCamelContext" xmlns="http://camel.apache.org/schema/spring">
  9. <package>com.test.camel.freemarker</package>
  10. </camelContext>
  11. </beans>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:camel="http://camel.apache.org/schema/spring"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"
 default-autowire="byName" default-init-method="init">
    <bean id="fmBean" class="com.test.camel.freemarker.FmProcessorBean"/>
    <camelContext id="testCamelContext" xmlns="http://camel.apache.org/schema/spring">
        <package>com.test.camel.freemarker</package>
    </camelContext>    
</beans>

6,启动Spring,在D:\temp\outbox文件夹下,每隔10秒钟,会根据freemarker模板生成一个fm.xml文件.

ApplicationContext ac = new ClassPathXmlApplicationContext("config/camelFreemarker.xml");
while (true) {
Thread.sleep(2000);
}

对本例beanRef("fmBean","prepareFMValues")的解释:

其意思是调用fmBean的prepareFMValues方法,Camel会负责将message的body绑定到要调用方法的第一个参数上面,其中可能做相应的类型转换.(本例中的方法的第一个参数为Exchange,没有转换的过程 ),这里给一个如下示例图解释这个绑定转换的过程:Camel将Exchange的的input message(exchange.getIn())转换为String,绑定到mtd方法的name参数上.(图片来源于Camel in Action)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值