【问题标题】:Jackson serializationConfig杰克逊序列化配置
【发布时间】:2011-07-03 21:26:36
【问题描述】:

我在 Spring 3 MVC 应用程序中使用 Jackson JSON。为了不序列化每个日期字段,我创建了一个使用特定日期格式的自定义对象映射器:

@Component("jacksonObjectMapper")
public class CustomObjectMapper extends ObjectMapper
{
    Logger log = Logger.getLogger(CustomObjectMapper.class);

    @PostConstruct
    public void afterProps()
    {
        log.info("PostConstruct... RUNNING");
        //ISO 8601
        getSerializationConfig().setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SZ"));


    }

    //constructors...

}

这个自定义的 ObjectMapper 被注入到 JsonConverter 中:

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="supportedMediaTypes" value="application/json" />
    <property name="objectMapper" ref="jacksonObjectMapper" /> <!-- defined in CustomObjectMapper -->
</bean>

日志和序列化工作也不例外,但它没有选择日期格式,它简单地序列化为时间戳。 @PostConstruct 注释有效,方法中的日志语句在日志中。

有人知道为什么会失败吗?

【问题讨论】:

  • 这个问题解决了吗?
  • @Sven Haiged 我没有将 json 表示为支持的媒体类型,但是我调试它时,json 包含在支持的媒体类型中并且运行良好。我错过了什么吗?

标签: json spring jackson


【解决方案1】:

您可能还需要指定您想要文本日期序列化,方法是:

configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);

(虽然我假设设置非空日期格式也可能触发它,但可能不会)

此外,您可以直接从构造函数配置映射器(这是安全的)。并不是说它应该改变行为,而是消除对单独配置方法的需要。

【讨论】:

  • 对不起,所有这些似乎都没有帮助。很奇怪。我仍然看到日期打印为时间戳。
  • 那么肯定会发生一些奇怪的事情;听起来可能您没有配置正在使用的 ObjectMapper,或者 Jackson 没有用于序列化。
【解决方案2】:

我已经完成了以下工作,以解决与 Java/PHP 时间戳的兼容性问题。 Java 使用毫秒,因为 EPOCH 和 PHP 使用秒,所以使用 ISO 日期更简单。

我声明以下消息适配器:

<bean id="messageAdapter"
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean id="jacksonJsonMessageConvertor"
                class="my.app.MyMappingJacksonHttpMessageConverter"/>                   
        </list>
    </property>
</bean>

MyMappingJacksonHttpMessageConverter 如下所示:

public class MyMappingJacksonHttpMessageConverter extends MappingJacksonHttpMessageConverter {

public MyMappingJacksonHttpMessageConverter(){
    super();
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(Feature.WRITE_DATES_AS_TIMESTAMPS, false);
    setObjectMapper(objectMapper);
}
}

以上所有日期均以 ISO 格式写出。

【讨论】:

    【解决方案3】:

    对于 Spring 配置 application.properties

    spring.jackson.serialization.fail-on-empty-beans=false
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-24
      • 2015-04-07
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 2016-09-13
      • 2016-07-16
      • 2012-11-19
      相关资源
      最近更新 更多