在 Spring 使用嵌套 XML 模板启动时使用 FreeMarker 模板
Use FreeMarker Template in Spring Boot with nested XML template
所以我有以下 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;
}
}
一切都很好,很幸福,但现在我想做下面的事情,避免重复,因为我有很多具有相同 header 结构的模板,将属于 header 的变量移动到一个名为 TemplateHeader 的新 class,如下所示:
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
扩展 TemplateHeader
)。请注意,类 和 getter 方法都必须是 public.
如果你想使用合成,如果在 Java API 中不透明(如 myComposite.getHeader().getCreator()
中),那就更棘手了。但它可以在模板中透明。 更新: 只需创建您的数据模型,例如
TemplateModelUtils.wrapAsHashUnion(config.getObjectWrapper(), myHeader, myData)
,其中 myHeader
和 myData
是您要 "compose" 的对象。
但是,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));
然后使用 dataModel
作为你的数据模型。
所以我有以下 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;
}
}
一切都很好,很幸福,但现在我想做下面的事情,避免重复,因为我有很多具有相同 header 结构的模板,将属于 header 的变量移动到一个名为 TemplateHeader 的新 class,如下所示:
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
扩展 TemplateHeader
)。请注意,类 和 getter 方法都必须是 public.
如果你想使用合成,如果在 Java API 中不透明(如 myComposite.getHeader().getCreator()
中),那就更棘手了。但它可以在模板中透明。 更新: 只需创建您的数据模型,例如
TemplateModelUtils.wrapAsHashUnion(config.getObjectWrapper(), myHeader, myData)
,其中 myHeader
和 myData
是您要 "compose" 的对象。
但是,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));
然后使用 dataModel
作为你的数据模型。