【问题标题】:Jackson XML - @JsonSerialize serializer runtime configurationJackson XML - @JsonSerialize 序列化程序运行时配置
【发布时间】:2016-11-29 14:04:07
【问题描述】:

@JsonSerialize 和 JsonSerializer 实现的所有示例都是similar 到以下。

public class JodaDateTimeJsonSerializer extends JsonSerializer<DateTime> {

    private static final String dateFormat = ("MM/dd/yyyy");

    @Override
    public void serialize(DateTime date, JsonGenerator gen, SerializerProvider provider)
            throws IOException, JsonProcessingException {

        String formattedDate = DateTimeFormat.forPattern(dateFormat).print(date);

        gen.writeString(formattedDate);
    }

}

它有一个定义其运行时行为的类级变量。这不能在运行时通过配置更改。

如何将dateFormat 设置在可配置属性之上,同时在属性上使用@JsonSerialize(using = JodaDateTimeJsonSerializer.class)

现在,我正在考虑将其设置为序列化程序实现上的静态非最终属性,该属性由运行时的应用程序在运行时设置。不能实现非常正确的实现。编辑:理想的解决方案将允许我〜注入〜(编辑:传入)只需要的配置到序列化程序中,而不是从某个全局检索配置。

注意:我不想为此属性创建新的数据类型(它们都是字符串),也不想创建自定义 bean 序列化程序(它们可以在任何地方的任何字符串属性上进行注释)。因此,我也不能使用SimpleModule::addSerializer(class, serializer) 方法,因为它们不应添加到所有 String 属性中。

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    您好,一些 ResourceBundle 实现提供了缓存功能。这意味着在这种情况下查找日期格式等属性不会对您的应用程序的性能产生影响,您可以直接在您的方法中查找。

    为了使配置中的任何更改在运行时生效。您应该每隔一段时间或在更新配置文件时清除 ResourceBundle 缓存。这可以通过调用方法轻松实现:

    ResourceBundle.clearCache();
    

    【讨论】:

    • 在我看来,这仍然会破坏封装(需要全局配置对象)。就我而言,我的选项已经由 Dropwizard 加载,而不是作为 ResourceBundle。这是一个更好的选择(因为可以在运行时重新加载这些值),但我仍然愿意接受更好的选择。感谢您的回复。
    • @DarylTeo 刚刚阅读了您的编辑“理想的解决方案将允许我仅将所需的配置注入序列化程序,而不是从某个全局检索配置”如果错误,请纠正我,但“注入”只是一种模式,在模式后面你仍然需要一个容器来保存你的配置。如果注入是您的问题,您可以随时使用依赖注入框架注入它。
    • 我的词选择错误:我使用术语“注入”作为动词,不一定是 DI 框架所暗示的“注入”。道歉
    猜你喜欢
    • 2018-07-18
    • 2017-01-11
    • 1970-01-01
    • 2017-06-12
    • 2013-12-06
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多