通常のSpringWebコントローラーを使用して、objectmapperbuilder構成でミックスインを構成し、データをミックスインに従って出力します。ただし、webfluxを使用すると、FlowまたはMonoを返すメソッドを持つコントローラーは、オブジェクトマッパーがデフォルトのデータであるかのようにデータをシリアル化します。
使用するオブジェクトマッパー構成を強制するためにwebfluxを取得するにはどうすればよいですか?
サンプル構成:
@Bean
JavaTimeModule javatimeModule(){
return new JavaTimeModule();
}
@Bean
Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer(){
return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.featuresToEnable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.mixIn(MyClass.class, MyClassMixin.class);
}
私は実際にinitコードをステップスルーすることで解決策を見つけました:
@Configuration
public class Config {
@Bean
JavaTimeModule javatimeModule(){
return new JavaTimeModule();
}
@Bean
Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer(){
return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.featuresToEnable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.mixIn(MyClass.class, MyClassMixin.class);
}
@Bean
Jackson2JsonEncoder jackson2JsonEncoder(ObjectMapper mapper){
return new Jackson2JsonEncoder(mapper);
}
@Bean
Jackson2JsonDecoder jackson2JsonDecoder(ObjectMapper mapper){
return new Jackson2JsonDecoder(mapper);
}
@Bean
WebFluxConfigurer webFluxConfigurer(Jackson2JsonEncoder encoder, Jackson2JsonDecoder decoder){
return new WebFluxConfigurer() {
@Override
public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
configurer.defaultCodecs().jackson2Encoder(encoder);
configurer.defaultCodecs().jackson2Decoder(decoder);
}
};
}
}
WebFluxConfigurerを実装し、メソッドをオーバーライドするだけですconfigureHttpMessageCodecs
Spring Boot 2 + Kotlinのサンプルコード
@Configuration
@EnableWebFlux
class WebConfiguration : WebFluxConfigurer {
override fun configureHttpMessageCodecs(configurer: ServerCodecConfigurer) {
configurer.defaultCodecs().jackson2JsonEncoder(Jackson2JsonEncoder(ObjectMapper()
.setSerializationInclusion(JsonInclude.Include.NON_EMPTY)))
configurer.defaultCodecs().jackson2JsonDecoder(Jackson2JsonDecoder(ObjectMapper()
.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)))
}
}
エンコード/デコードされるすべてのデータクラスに、プロパティ名がクラスとjsonデータで等しい場合でも、すべてのプロパティに@ JsonPropertyアノテーションが付けられていることを確認してください
data class MyClass(
@NotNull
@JsonProperty("id")
val id: String,
@NotNull
@JsonProperty("my_name")
val name: String)
@AlbertoGalianaのソリューションをJavaに変換し、便宜上、構成済みのObjectmapperを注入したので、複数の構成を行う必要がなくなりました。
@Configuration
@RequiredArgsConstructor
public class WebFluxConfig implements WebFluxConfigurer {
private final ObjectMapper objectMapper;
public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
configurer.defaultCodecs().jackson2JsonEncoder(
new Jackson2JsonEncoder(objectMapper)
);
configurer.defaultCodecs().jackson2JsonDecoder(
new Jackson2JsonDecoder(objectMapper)
);
}
}