现在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;
}
答案 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()
或类似的东西会很好,但它看起来并不可能。