首页 > 解决方案 > 使用 Smook 和 Freemarker 将 Java 对象转换为 XML 的模型是什么?

问题描述

我无法找到有关如何进行以下转换的明确文档:

Java 对象 -> Smooks/Freemarker 模板 -> XML 输出

这是我正在尝试的示例:

Java POJO(我有一个单独的 DAO 类来填充这个对象):

package Transformer;

public class JavaObject {
    String name; 
}

主变压器类:

package Transformer;

import java.io.IOException;
import java.io.StringWriter;

import javax.xml.transform.stream.StreamResult;

import org.milyn.Smooks;
import org.milyn.container.ExecutionContext;
import org.milyn.payload.JavaSource;
import org.xml.sax.SAXException;

public class Transformer {

     protected static String runSmooksTransform(Object javaObject) throws IOException, SAXException {
        Smooks smooks = new Smooks("smooks-config.xml");
        try {
            ExecutionContext executionContext = smooks.createExecutionContext();
            StringWriter writer = new StringWriter();
            smooks.filterSource(executionContext, new JavaSource("smooks-config.xml"), new StreamResult(writer));
            return writer.toString();
        } finally {
            smooks.close();
        }
    }

    public static void main(String args[]) {
        try {
            Transformer.runSmooksTransform(javaObject);
        } catch(Throwable ex){
            System.err.println("Uncaught exception - " + ex.getMessage());
            ex.printStackTrace(System.err);
        }
    }
}

所以这就是我感到困惑的地方......我已经看到了几种“映射”模板的不同方法

这是我见过的一些例子:

具有如下映射的 .ftl 模板文件:

     <Nm> ${Name} </Nm>

像这样的 XML 映射:

    <medi:segment minOccurs="0" maxOccurs="1" segcode="" xmltag="Group">
                <medi:field xmltag="Name" />
    </medi:segment>

在 smooks-config.xml 中映射:

 <?xml version="1.0"?>
 <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.0.xsd" 
 xmlns:ftl="http://www.milyn.org/xsd/smooks/freemarker-1.1.xsd">

     <resource-config selector="global-parameters">
         <param name="stream.filter.type">SAX</param>
     </resource-config>

     <reader mappingModel="example.xml" />

     <ftl:freemarker applyOnElement="order">
         <ftl:template>
           <Nm>${name}</Nm>
         </ftl:template>
     </ftl:freemarker>

 </smooks-resource-list>

那么任何人都可以解释使用 Smooks + Freemarker 模板将 java 对象转换为指定的 XML 输出的正确方法吗?

或者指向我特定于这个用例的文档/示例?

谢谢

标签: javaxmlfreemarkersmooks

解决方案


我不知道它是如何在 Smooks 中完成的,但很可能你需要public String getName() { return name; }JavaObject类中添加一个,否则它不会从 FreeMarker 模板中显示出来。它实际上取决于 FreeMarker 配置设置(我不知道 Smooks 是如何配置它的),所以理论上一切皆有可能,但您可能需要一个 getter 方法,但如果不是,那么至少该字段需要是public.

此外,您不会javaObject在示例代码中传递给 Smooks,尽管我猜这不是真正的代码。


推荐阅读