在 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)