Jackson2在服务器上运行时会创建错误的日期格式

时间:2012-09-29 21:09:55

标签: java jackson

在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,我猜你不会得到时间戳。

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

  

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

在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);