多くの検索の後、@ 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をシリアル化しても、タイムスタンプが取得されます。
これが機能しない理由を誰かが知っていますか?私は困惑しています!
何度もいじった後、次のコードで問題が解決したことがわかりました。
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メッセージコンバーターにアクセスして構成する簡単な方法があるかどうかはわかりません。しかし、これは私のために働いています。
はい、@ Feyyazに同意します。プロパティ/ ymlファイルに設定を追加することは、デフォルトのコンテキスト(デ)シリアライザーを設定する方法です。
詳細については、Springドキュメントのこの部分を参照してください。
元のリンクが削除された場合の引用:
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つの列挙型で説明されています。たとえば、プリティプリントを有効にするには、
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
のすべての自動設定が無効になることに注意してください。タイプ@Beans
のMappingJackson2HttpMessageConverter
を指定すると、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
はい、コンバーターが使用しているオブジェクトマッパーをフックして変更するには、次のようにします。
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();
}
ObjectMapper objectMapper = new ObjectMapper()
.registerModule(new JavaTimeModule())
.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true)
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);