java - 在 Spring Boot 中使用带有嵌套 XML 模板的 FreeMarker 模板
问题描述
所以我有下面的 FreeMarker 模板:
<?xml version="1.0" encoding="ISO-8859-1"?>
<master>
<header>
<version>${version}</version>
<created>${created}</created>
<creator>${creator}</creator>
<draw>${draw}</draw>
<game>${game}</game>
<type>${type}</type>
<sender>${sender}</sender>
<recipient>${recipient}</recipient>
<revision>${revision}</revision>
</header>
<data>
<stake>
${stake}
</stake>
<checksum_combifile>
${checksumFile}
</checksum_combifile>
</data>
</master>
下面是 FreeMarker 模板的 POJO:
public class SscMessageVo {
/* Header */
private String version = "1.00";
private String created;
private String creator;
private String draw;
private String game;
private String type;
private String sender;
private String recipient;
private String revision;
/* Data */
private String stake;
private String checksumFile;
public SscMessageVo() {
super();
}
public SscMessageVo(final String version, final String created, final String creator, final String draw, final String game, final String type, final String sender, final String recipient,
final String revision, final String stake, final String checksumFile) {
super();
this.version = version;
this.created = created;
this.creator = creator;
this.draw = draw;
this.game = game;
this.type = type;
this.sender = sender;
this.recipient = recipient;
this.revision = revision;
this.stake = stake;
this.checksumFile = checksumFile;
}
public String getStake() {
return stake;
}
public void setStake(final String stake) {
this.stake = stake;
}
public String getChecksumFile() {
return checksumFile;
}
public void setChecksumFile(final String checksumFile) {
this.checksumFile = checksumFile;
}
public String getVersion() {
return version;
}
public void setVersion(final String version) {
this.version = version;
}
public String getCreated() {
return created;
}
public void setCreated(final String created) {
this.created = created;
}
public String getCreator() {
return creator;
}
public void setCreator(final String creator) {
this.creator = creator;
}
public String getDraw() {
return draw;
}
public void setDraw(final String draw) {
this.draw = draw;
}
public String getGame() {
return game;
}
public void setGame(final String game) {
this.game = game;
}
public String getType() {
return type;
}
public void setType(final String type) {
this.type = type;
}
public String getSender() {
return sender;
}
public void setSender(final String sender) {
this.sender = sender;
}
public String getRecipient() {
return recipient;
}
public void setRecipient(final String recipient) {
this.recipient = recipient;
}
public String getRevision() {
return revision;
}
public void setRevision(final String revision) {
this.revision = revision;
}
}
一切都很好,一切都很甜蜜和快乐,但现在我想做以下事情,避免重复,因为我有许多具有相同标题结构的模板,将属于标题的变量移动到一个名为TemplateHeader的新类,如下所示:
public class TemplateHeader {
/* Header */
private String version;
private String created;
private String creator;
private String draw;
private String game;
private String type;
private String sender;
private String recipient;
private String revision;
public TemplateHeader() {
super();
}
public TemplateHeader(String version, String created, String creator, String draw, String game, String type, String sender, String recipient, String revision) {
super();
this.version = version;
this.created = created;
this.creator = creator;
this.draw = draw;
this.game = game;
this.type = type;
this.sender = sender;
this.recipient = recipient;
this.revision = revision;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getCreated() {
return created;
}
public void setCreated(String created) {
this.created = created;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public String getDraw() {
return draw;
}
public void setDraw(String draw) {
this.draw = draw;
}
public String getGame() {
return game;
}
public void setGame(String game) {
this.game = game;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getRecipient() {
return recipient;
}
public void setRecipient(String recipient) {
this.recipient = recipient;
}
public String getRevision() {
return revision;
}
public void setRevision(String revision) {
this.revision = revision;
}
}
但我不知道该怎么做,我从 FreeTemplate 收到错误,在网上找不到任何教程....
解决方案
您可以使用继承(SscMessageVo
extends TemplateHeader
)。请注意,类和 getter 方法都必须是公共的。
如果您想使用组合,如果它在 Java API 中不透明(如 参考资料),那就更棘手了myComposite.getHeader().getCreator()
。但它可以在模板中是透明的。更新:只需创建您的数据模型,例如
TemplateModelUtils.wrapAsHashUnion(config.getObjectWrapper(), myHeader, myData)
,您想要“组合”的对象的位置myHeader
和位置。myData
但是,TemplateModelUtils.wrapAsHashUnion
仅存在于 2.3.29 之后(远未在 2018-09-12 发布)。所以同时,检查源代码(https://github.com/apache/freemarker/blob/2.3-gae/src/main/java/freemarker/template/utility/TemplateModelUtils.java)。不过,您的可能要简单得多。你只需要像var ow = cfg.getObjectWrapper(); TemplateHashModel dataModel = new HashUnionModel(ow.wrap(myHeader), ow.wrap(myData));
Then use这样的东西dataModel
作为你的数据模型。
推荐阅读
- python - tensorflow 核心功能中模块的缺失/存在
- arrays - 我如何过滤一组对象以仅显示具有所有现有类型属性的对象的 id
- npm-install - package.json 禁用“npm install”
- java - 为什么spring data dynamodb返回一个带有空元素的列表而不是一个空列表?
- linux - 文件和内存。它们是如何映射的...调试、文件系统“ls -a”文件和正在运行的程序的地址空间
- wordpress - 如何在 wordpress/elementor 页面上创建交互式地图
- python - Python 找不到 Wolframalpha 模块
- android - 如何让图标始终出现在 ActionBar 的右侧?
- python - 如果存在于另一个元组中,如何从元组列表中删除元组
- dart - 不确定如何在操作员之前解决 null 感知