【问题标题】:Is there any way to add an ExclusionStrategy to Thymeleaf 3.0.5?有没有办法将 ExclusionStrategy 添加到 Thymeleaf 3.0.5?
【发布时间】:2017-09-24 03:03:47
【问题描述】:

既然 Thyemleaf 3.0.5 正在使用 Jackson,有没有办法将 com.google.gson.ExclusionStrategy 之类的东西添加到组合中?

也与此有关:

Thymeleaf inline javascript ignore null

更新:

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

IStandardJavaScriptSerializer 实现 sn-p...

@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 sn-p...

@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;
}

【问题讨论】:

    标签: java jackson thymeleaf


    【解决方案1】:

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

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

    您可以从那里创建您自己的IStandardJavaScriptSerializer,您可以在其中随意配置 ObjectMapper。 (我用这行代码this.mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 创建了一个SpecialJacksonSerializer 来验证它是否有效。)

    dialect.setJavaScriptSerializer(new SpecialJacksonSerializer());
    

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

    【讨论】:

    • 谢谢!这是我需要的 95%。我不得不从使用 XML 配置切换到使用 java 配置,然后我基本上可以做你在这里所拥有的。我最终构建了自己的 IStandardJavaScriptSerializer,请参阅我对问题的更新中的代码。再次感谢,非常感谢您的帮助。
    猜你喜欢
    • 2018-11-30
    • 2016-12-13
    • 2022-01-13
    • 1970-01-01
    • 2021-09-21
    • 2016-03-24
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多