java - 使用 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 输出的正确方法吗?
或者指向我特定于这个用例的文档/示例?
谢谢
解决方案
我不知道它是如何在 Smooks 中完成的,但很可能你需要public String getName() { return name; }
在JavaObject
类中添加一个,否则它不会从 FreeMarker 模板中显示出来。它实际上取决于 FreeMarker 配置设置(我不知道 Smooks 是如何配置它的),所以理论上一切皆有可能,但您可能需要一个 getter 方法,但如果不是,那么至少该字段需要是public
.
此外,您不会javaObject
在示例代码中传递给 Smooks,尽管我猜这不是真正的代码。
推荐阅读
- php - Laravel php artisan serve 不尊重 env 标志
- node.js - 如何在电子中将文件剪辑到剪贴板?
- powershell - 从文本文件将多个值传递给 PowerShell 脚本
- php - 在 Codeigniters 中计算两个 MySQL 表中的所有行
- node.js - 量角器配置中的进程退出状态 199 错误代码
- rust - 以科学计数法打印的浮点数的对齐方式
- javascript - 在 iOS 中使用 safari 并立即在 Nuxt.js 中重新加载时,Firebase 匿名身份验证数据已重置
- python - 在 SQL Server 中使用 Python 更新表中列的值
- loops - 如何编写明文和密钥长度不同的加密循环
- c# - "About the "code" tag in the RichText field of "Contentful dotnet SDK