web-dev-qa-db-ja.com

Jackson SerializationFeature.WRITE_DATES_AS_TIMESTAMPSが春にタイムスタンプをオフにしない

多くの検索の後、@ RestControllerでJSON応答に変換するときに、Java.util.Dateフィールドがタイムスタンプにシリアル化されないようにする方法を追跡しました。

しかし、私はそれを機能させることができません。私が見つけたすべての投稿は、Jackson objetマッパーのSerializationFeature.WRITE_DATES_AS_TIMESTAMPS機能を無効にすると言っていました。だから私は次のコードを書きました:

public class MVCConfig {

    @Autowired
    Jackson2ObjectMapperFactoryBean objectMapper;

    @PostConstruct
    public void postConstruct() {
        this.objectMapper.setFeaturesToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    }
}

私が理解しているように、設定もBeanなので、追加のプロパティを設定するためのオブジェクトマッパーでの自動ワイヤリングが機能するはずです。私はブレークポイントを使用しましたが、このセットアップではすべてがうまく見えます。

ただし、httpクエリへの応答でJava.util.Dateプロパティを使用してBeanをシリアル化しても、タイムスタンプが取得されます。

これが機能しない理由を誰かが知っていますか?私は困惑しています!

16
drekka

何度もいじった後、次のコードで問題が解決したことがわかりました。

public class MVCConfig extends WebMvcConfigurerAdapter {
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { 
        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                MappingJackson2HttpMessageConverter jsonMessageConverter = (MappingJackson2HttpMessageConverter) converter;
                ObjectMapper objectMapper = jsonMessageConverter.getObjectMapper();
                objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
                break;
            }
        }
    }
}

Jackson MVCメッセージコンバーターにアクセスして構成する簡単な方法があるかどうかはわかりません。しかし、これは私のために働いています。

32
drekka

はい、@ Feyyazに同意します。プロパティ/ ymlファイルに設定を追加することは、デフォルトのコンテキスト(デ)シリアライザーを設定する方法です。

詳細については、Springドキュメントのこの部分を参照してください。

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper

元のリンクが削除された場合の引用:

79.3 Jackson ObjectMapperのカスタマイズ

Spring MVC(クライアントおよびサーバー側)はHttpMessageConvertersを使用して、HTTP交換でのコンテンツ変換をネゴシエートします。ジャクソンがクラスパス上にある場合、Jackson2ObjectMapperBuilderによって提供されるデフォルトのコンバーターを既に取得しています。 ObjectMapper(またはJackson XMLコンバーターの場合はXmlMapper)インスタンス(デフォルトで作成されます)には、以下のカスタマイズされたプロパティがあります。

  • MapperFeature.DEFAULT_VIEW_INCLUSIONは無効です
  • DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIESは無効です
  • SerializationFeature.WRITE_DATES_AS_TIMESTAMPSは無効です

Spring Bootには、この動作のカスタマイズを容易にするいくつかの機能もあります。環境を使用して、ObjectMapperおよびXmlMapperインスタンスを構成できます。ジャクソンは、その処理のさまざまな側面を構成するために使用できるシンプルなオン/オフ機能の広範なスイートを提供します。これらの機能は6つの列挙型で説明されています。

|列挙型|プロパティ|値| | -| -| | com.fasterxml.jackson.databind.DeserializationFeature | spring.jackson.deserialization.<feature_name> | truefalse | | com.fasterxml.jackson.core.JsonGenerator.Feature | spring.jackson.generator.<feature_name> | truefalse | | com.fasterxml.jackson.databind.MapperFeature | spring.jackson.mapper.<feature_name> | truefalse | | com.fasterxml.jackson.core.JsonParser.Feature | spring.jackson.parser.<feature_name> | truefalse | | com.fasterxml.jackson.databind.SerializationFeature | spring.jackson.serialization.<feature_name> | truefalse | | com.fasterxml.jackson.annotation.JsonInclude.Include | spring.jackson.default-property-inclusion | alwaysnon_nullnon_absentnon_defaultnon_empty |

たとえば、プリティプリントを有効にするには、spring.jackson.serialization.indent_output=trueを設定します。 ---(relaxed binding を使用しているため、indent_outputの大文字と小文字は、対応する列挙型定数の大文字と小文字で一致する必要はありません。つまり、INDENT_OUTPUTです。この環境ベースの設定は、自動設定されたJackson2ObjectMapperBuilder Beanに適用され、自動設定されたObjectMapper Beanを含む、ビルダーを使用して作成されたマッパーに適用されます。コンテキストのJackson2ObjectMapperBuilderは、1つ以上のJackson2ObjectMapperBuilderCustomizer Beanによってカスタマイズできます。このようなカスタマイザBeanを注文することができ(Boot独自のカスタマイザの順序は0です)、Bootのカスタマイズの前後に追加のカスタマイズを適用できます。タイプcom.fasterxml.jackson.databind.ModuleのBeanはすべて、自動構成されたJackson2ObjectMapperBuilderに自動的に登録され、作成したObjectMapperインスタンスに適用されます。これは、アプリケーションに新しい機能を追加するときにカスタムモジュールを提供するためのグローバルメカニズムを提供します。デフォルトのObjectMapperを完全に置き換える場合は、そのタイプの@Beanを定義して@Primaryとしてマークするか、ビルダーベースのアプローチを使用する場合はJackson2ObjectMapperBuilder@Bean。どちらの場合も、そうすることでObjectMapperのすべての自動設定が無効になることに注意してください。タイプ@BeansMappingJackson2HttpMessageConverterを指定すると、MVC構成のデフォルト値が置き換えられます。また、タイプHttpMessageConvertersのコンビニエンスBeanが提供されます(デフォルトのMVC構成を使用する場合は常に使用可能です)。これには、デフォルトおよびユーザー拡張のメッセージコンバーターにアクセスするための便利なメソッドがいくつかあります。詳細については、「 セクション79.4、「@ ResponseBodyレンダリングのカスタマイズ」 」セクションおよび WebMvcAutoConfiguration ソースコードを参照してください。

(StackOverFlowマークダウンはテーブル構文をサポートしていないため、形式が正しくありません。この部分をSublime Textにコピーして貼り付け、.mdとして保存して、元のリンクを表示または確認してください。)

例:

spring:
  jackson:
    default-property-inclusion: non_null # to exclude null in json serialization
    serialization:
      write-dates-as-timestamps: true # write milliseconds since Epoch in the final json

または:

spring.jackson.default-property-inclusion: non_null # to exclude null in json serialization
spring.jackson.serialization.write-dates-as-timestamps: true # write milliseconds since Epoch in the final json
2
WesternGun

はい、コンバーターが使用しているオブジェクトマッパーをフックして変更するには、次のようにします。

public class CustomObjectMapper extends ObjectMapper {
    public CustomObjectMapper() {
        this.configure(com.fasterxml.jackson.databind.SerializationFeature.
                WRITE_DATES_AS_TIMESTAMPS, false);
    }
}

そしてあなたの内部MVCConfig

@Bean
public ObjectMapper jacksonObjectMapper() {
    return new CustomObjectMapper();
}

@Bean
public SerializationConfig serializationConfig() {
    return jacksonObjectMapper().getSerializationConfig();
}
1
Master Slave
ObjectMapper objectMapper = new ObjectMapper()
                .registerModule(new JavaTimeModule())
                .configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true)
                .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
1
T D