在 FreeMarker 中,如何自动将自定义对象(例如 java.awt.Color)转换为特定的字符串值(例如 HTML 十六进制颜色)?
In FreeMarker, how do I automatically convert a custom object (e.g. java.awt.Color) to a particular String value (e.g. HTML hex color)?
在我的数据模型中,我有很多方法将 return 颜色编码为 HTML color hex code (e.g. #8da6b1). These methods would be much simpler if they could simply return a java.awt.Color 并让 FreeMarker 对象包装器负责转换。我需要在 FreeMarker 的配置中添加什么?我需要编写自定义 ObjectWrapper 吗?如果有,代码是什么?
更新:FreeMarker 手册现在有一个更好(更高级)的例子来做这种事情:http://freemarker.org/docs/pgui_datamodel_objectWrapper.html#pgui_datamodel_customObjectWrappingExample。重要的一点是,如果你想在将它传递给模板中的 Java 方法时取回你的 Color
(与 String
相对),那么你必须实现AdapterTemplateModel
,所以 SimpleScalar
不够好。
扩展 DefaultObjectWrapper
(或您正在使用的任何 ObjectWrapper
):
@Override
protected TemplateModel handleUnknownType(Object obj) throws TemplateModelException {
if (obj instanceof Color) {
return new SimpleScalar(toHTMLHexCode((Color) obj));
}
return super.handleUnknownType(obj);
}
实施 toHTMLHexCode
的任务留给您。然后在设置 Configuration
单例的地方,执行 cfg.setObjectWrapper(new YourObjectWrapper(Configuration.VERSION_2_X_Y))
,或者如果您从 Properties
配置 FreeMarker,则 object_wrapper=com.example.YourObjectWrapper(2.X.Y)
在我的数据模型中,我有很多方法将 return 颜色编码为 HTML color hex code (e.g. #8da6b1). These methods would be much simpler if they could simply return a java.awt.Color 并让 FreeMarker 对象包装器负责转换。我需要在 FreeMarker 的配置中添加什么?我需要编写自定义 ObjectWrapper 吗?如果有,代码是什么?
更新:FreeMarker 手册现在有一个更好(更高级)的例子来做这种事情:http://freemarker.org/docs/pgui_datamodel_objectWrapper.html#pgui_datamodel_customObjectWrappingExample。重要的一点是,如果你想在将它传递给模板中的 Java 方法时取回你的 Color
(与 String
相对),那么你必须实现AdapterTemplateModel
,所以 SimpleScalar
不够好。
扩展 DefaultObjectWrapper
(或您正在使用的任何 ObjectWrapper
):
@Override
protected TemplateModel handleUnknownType(Object obj) throws TemplateModelException {
if (obj instanceof Color) {
return new SimpleScalar(toHTMLHexCode((Color) obj));
}
return super.handleUnknownType(obj);
}
实施 toHTMLHexCode
的任务留给您。然后在设置 Configuration
单例的地方,执行 cfg.setObjectWrapper(new YourObjectWrapper(Configuration.VERSION_2_X_Y))
,或者如果您从 Properties
配置 FreeMarker,则 object_wrapper=com.example.YourObjectWrapper(2.X.Y)