2

Tomcat6、Tomcat7、またはWAS7で実行すると、次のコードは常に内部java.util.Dateプロパティをミリ秒形式ではなくyyyy-MM-DD形式として出力します。

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

スタンドアロンで実行している場合、上記のコードは正しいミリ秒形式を出力します。

サーバーが干渉するためにできることはありますか?ここではJackson2.0.6とSpring3.1.2を使用しています。

結果: 問題は、Dateオブジェクトがjava.sql.Dateを取得していることであることがわかりました。java.sql.Dateを使用している場合、タイムスタンプは取得されないと思います。

4

2 に答える 2

1

ここで説明するように、Jacksonシリアル化構成はSpringや休止状態を含む多くの場所で踏まれている可能性があり ます。Spring3.1のJacksonSerializationConfig.Feature設定はどこで指定しますか。

Spring / Hibernateが実行していることを実行しないようにするためのより正しい解決策はおそらくありますが、それが私次第である場合は、次のようにします。

ObjectMapper om = new ObjectMapper();
om.setDateFormat(null);
System.out.println(om.writeValueAsString(myObject));
于 2012-09-29T22:13:58.247 に答える
0

結果:問題は、Dateオブジェクトがjava.sql.Dateを取得していることであることがわかりました。java.sql.Dateを使用している場合、タイムスタンプは取得されないと思います。

Jacksonは、java.sql.Dateの場合、プロパティWRITE_DATES_AS_TIMESTAMPSまたはsetDateFormatのフォーマットを使用していません。これを可能にするには、ObjectMapper用の特別なシリアライザーを提供する必要があります。

そんな感じ:

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);
于 2018-05-22T07:15:23.627 に答える