【问题标题】:Jackson2 creates wrong date format when running on serverJackson2 在服务器上运行时创建错误的日期格式
【发布时间】:2012-09-29 21:09:54
【问题描述】:

在 Tomcat6 或 Tomcat7 或 WAS7 上运行时,以下代码始终将内部 java.util.Date 属性打印为 yyyy-MM-DD 格式而不是毫秒格式。

ObjectMapper om = new ObjectMapper();
System.out.println(om.writeValueAsString(myObject));

当独立运行时,上面的代码会打印出正确的毫秒格式。

服务器有什么可以干扰的吗?我在这里使用 Jackson 2.0.6 和 Spring 3.1.2。

结果: 我发现问题是我的 Date 对象正在获取 java.sql.Date。如果你使用 java.sql.Date,我猜你不会得到时间戳。

【问题讨论】:

    标签: java jackson


    【解决方案1】:

    Jackson 序列化配置可能在许多地方被踩到,包括 spring 和/或 hibernate,如下所述:Where do I specify Jackson SerializationConfig.Feature settings in Spring 3.1

    可能有更正确的解决方案来阻止 Spring/Hibernate 做他们正在做的事情,但如果由我决定,我会做以下事情:

    ObjectMapper om = new ObjectMapper();
    om.setDateFormat(null);
    System.out.println(om.writeValueAsString(myObject));
    

    【讨论】:

      【解决方案2】:

      结果:我发现问题在于我的 Date 对象正在获取 java.sql.日期。我猜如果您使用的是时间戳,您将不会获得时间戳 java.sql.日期。

      对于 java.sql.Date,Jackson 没有使用属性 WRITE_DATES_AS_TIMESTAMPS 或 setDateFormat 中的格式。为了使它成为可能,需要为 ObjectMapper 提供特殊的 Serializer。

      类似的东西:

      import java.io.IOException;
      import java.text.DateFormat;
      
      import com.fasterxml.jackson.core.JsonGenerator;
      import com.fasterxml.jackson.databind.SerializerProvider;
      import com.fasterxml.jackson.databind.ser.std.StdSerializer;
      
      public class SqlDateSerializer extends StdSerializer<java.sql.Date> {
      
          private static final long serialVersionUID = 1L;
      
          public SqlDateSerializer() {
              super(java.sql.Date.class, true);
          }
      
          private ThreadLocal<DateFormat> DATE_FORMAT 
              = ThreadLocal.withInitial(() 
                 -> new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"));
      
          @Override
          public void serialize(java.sql.Date value, JsonGenerator gen, SerializerProvider provider) throws IOException {
      
              String formatted = DATE_FORMAT.get().format(value);
              gen.writeString(formatted);
          }
      }
      

      用法:

      SimpleModule simpleModule = new SimpleModule();
      simpleModule.addSerializer(java.sql.Date.class, new SqlDateSerializer());
      
      ObjectMapper om = new ObjectMapper();
      om.registerModule(simpleModule);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多