我的 Freemarker ObjectWrapper 如何访问模板设置

How can my Freemarker ObjectWrapper access a template setting

用例:系统管理员将 Freemarker 模板存储在数据库中,该数据库用于(通过 Spring Boot REST API)以区域感知方式呈现系统用户(响应者)存储的信息不同用户类型(审阅者)的方式。

受访者的回答可能存储在此类对象中(或在此类对象的列表中,如果向受访者提出的问题预计会有多个答案):

// snip
import com.fasterxml.jackson.databind.node.ObjectNode;
// more imports snipped

public class LanguageStringMap {
    private Map<Language, String> languageStringMap;

    public LanguageStringMap(ObjectNode languageMapNode) {
        // snip of code instantiating a LanguageStringMap from JSON
    }

    public void put(Language language, String value) {
        if (value.length() == 0)
            throw new IllegalArgumentException(String.format(
                    "value for language '%s' of zero length", language.getCode()));
        languageStringMap.put(language, value);
    }

    public String get(Language language) { return languageStringMap.get(language); }
}

我想我想做的是编写一个 ObjectWrapper,将 LanguageStringMap 的实例映射到一个字符串(通过调用 get() 方法获得,该方法使用从审阅者请求的 Locale 派生的语言浏览器并在模板的设置中进行设置)。与让上传的模板包含一堆模板方法调用相比,这为系统管理员提供了更清晰的用户体验。

为此,我的对象包装器需要访问模板设置。我已经仔细阅读了pertinent Freemarker documentation,但我仍然不清楚如何做到这一点,或者是否有可能。

我认为尝试使用与模板一起上传到数据库的资源包来实现这一点是错误的,但这是一个考虑因素。

通常,您只需在处理模板之前将特定于语言环境的字符串与所有其他变量一起放入数据模型中。在这种情况下,不需要 ObjectWrapper 定制。但是,如果您必须使用基于 ObjectWrapper 的解决方案,那么您可以使用 Environment.getCurrentEnvironment().getLocale()ObjectWrapper 方法中获取语言环境(就像在 DefaultObjectWrapper.handleUnknownType 的覆盖中一样)。