有没有办法在Thymeleaf 3.0.5中添加ExclusionStrategy?

时间:2017-04-26 15:40:27

标签: java jackson thymeleaf

现在Thyemleaf 3.0.5正在使用Jackson,有没有办法添加类似com.google.gson.ExclusionStrategy的内容?

也与此有关:

Thymeleaf inline javascript ignore null

更新

使用Metroids建议的答案我能够使这个工作。 我首先必须从我的XML配置文件切换到使用java配置文件来配置Thymeleaf。然后我就能够访问MetroID所示的StandardDialect。我实现了IStandardJavaScriptSerializer接口覆盖#serializeValue(Object object,Writer writer)。

IStandardJavaScriptSerializer实现代码段...

@Override
public void serializeValue(Object object, Writer writer) {
    try {
        ExclusionStrategy exclusionStrategy = new MyApiJsonExcludeExclusionStrategy();
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.setExclusionStrategies(exclusionStrategy);
    Gson gson = gsonBuilder.create();
    writer.write(gson.toJson(object));
    } catch (IOException e) {
        throw new TemplateProcessingException("An exception was raised while trying to serialize object to JavaScript using Gson", e);
    }
}

Thymeleaf Java Config片段......

@Bean
public TemplateEngine templateEngine() {
    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.setEnableSpringELCompiler(true);

    Set<IDialect> dialects = engine.getDialects();
    StandardDialect dialect = (StandardDialect) dialects.stream()
            .filter(d -> d instanceof StandardDialect)
            .findFirst()
            .get();
    dialect.setJavaScriptSerializer(new MyThymeleafJavascriptSerializer());

    engine.setTemplateResolvers(getTemplateResolvers());
    engine.setAdditionalDialects(getAdditionalDialects());
    return engine;
}

1 个答案:

答案 0 :(得分:1)

是的,它可能......但在我看来它仍然有点丑陋(因为没有简单的方法可以自己创建一个ObjectMapper)。我通过这样做完成了......首先,无论您在何处配置模板引擎,都应该能够访问StandardDialect。

    Set<IDialect> dialects = templateEngine.getDialects();
    StandardDialect dialect = (StandardDialect) dialects.stream()
            .filter(d -> d instanceof StandardDialect)
            .findFirst()
            .get();

从那里你可以创建自己的IStandardJavaScriptSerializer,你可以根据需要配置ObjectMapper。 (我使用此行代码SpecialJacksonSerializer创建了this.mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);以验证其是否有效。)

dialect.setJavaScriptSerializer(new SpecialJacksonSerializer());

由于thymeleaf在后台进行了大量配置(请参阅this file),因此在创建自己的代码时最终会复制大量代码。如果你能打电话给dialect.getJavaScriptSerializer().getObjectMapper()或类似的东西会很好,但它看起来并不可能。