如何为单个Spring端点禁用FAIL_ON_NULL_CREATOR_PROPERTIES特性
单个Spring端点禁用Jackson的FAIL_ON_NULL_CREATOR_PROPERTIES特性
针对你的需求,不用修改全局Jackson配置,仅为指定端点禁用FAIL_ON_NULL_CREATOR_PROPERTIES特性,有以下几种可行方案:
方案1:通过@InitBinder针对目标端点配置
在对应控制器中添加@InitBinder方法,精准修改目标端点使用的ObjectMapper特性:
@RestController class YourController { // 绑定到目标DTO的参数名(或类型),仅对使用该DTO的端点生效 @InitBinder("targetDto") fun initTargetDtoBinder(binder: WebDataBinder) { val converter = binder.convertService as MappingJackson2HttpMessageConverter converter.objectMapper.disable(DeserializationFeature.FAIL_ON_NULL_CREATOR_PROPERTIES) } @PostMapping("/your-target-endpoint") fun handleRequest(@RequestBody targetDto: YourNullableDto): ResponseEntity<Any> { // 业务逻辑处理 return ResponseEntity.ok().build() } }
注意:@InitBinder的参数要和端点方法中DTO的变量名一致,或者直接指定DTO类型(比如@InitBinder(YourNullableDto::class.java)),避免影响控制器内其他端点。
方案2:自定义HttpMessageConverter绑定到指定端点
通过自定义消息转换器,为目标端点单独设置Jackson特性:
- 定义自定义Jackson转换器:
@Component class NullAllowedJacksonConverter : MappingJackson2HttpMessageConverter() { init { // 禁用目标特性 objectMapper.disable(DeserializationFeature.FAIL_ON_NULL_CREATOR_PROPERTIES) // 指定自定义媒体类型,用于区分全局转换器 supportedMediaTypes = listOf(MediaType("application", "vnd.null-allowed+json")) } }
- 配置WebMvc注册转换器:
@Configuration class WebMvcConfig : WebMvcConfigurer { @Autowired lateinit var nullAllowedJacksonConverter: NullAllowedJacksonConverter override fun configureMessageConverters(converters: MutableList<HttpMessageConverter<*>>) { // 先添加自定义转换器,再添加全局默认转换器 converters.add(nullAllowedJacksonConverter) converters.add(MappingJackson2HttpMessageConverter()) } }
- 在目标端点指定使用自定义媒体类型:
@PostMapping( value = ["/your-target-endpoint"], consumes = ["application/vnd.null-allowed+json"] ) fun handleRequest(@RequestBody targetDto: YourNullableDto): ResponseEntity<Any> { // 业务逻辑处理 return ResponseEntity.ok().build() }
发送请求时,将Content-Type设为application/vnd.null-allowed+json,该请求就会使用自定义转换器,允许显式传入null值,其他请求仍遵循全局配置。
方案3:DTO级别的局部配置(仅适用于该DTO所有场景都允许null的情况)
如果不需要区分端点,只是希望该DTO允许显式null,可以在DTO构造器参数上添加@JsonProperty(required = false):
data class YourNullableDto( val id: Long, @JsonProperty(required = false) val trial_period: Int?, // 其他可为空字段同理 )
但此方法会影响所有使用该DTO的端点,不符合“仅为单个端点配置”的需求,酌情使用。
内容的提问来源于stack exchange,提问作者user20918149
相关产品推荐
相关产品推荐

