You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为单个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特性:

  1. 定义自定义Jackson转换器:
@Component
class NullAllowedJacksonConverter : MappingJackson2HttpMessageConverter() {
    init {
        // 禁用目标特性
        objectMapper.disable(DeserializationFeature.FAIL_ON_NULL_CREATOR_PROPERTIES)
        // 指定自定义媒体类型,用于区分全局转换器
        supportedMediaTypes = listOf(MediaType("application", "vnd.null-allowed+json"))
    }
}
  1. 配置WebMvc注册转换器:
@Configuration
class WebMvcConfig : WebMvcConfigurer {
    @Autowired
    lateinit var nullAllowedJacksonConverter: NullAllowedJacksonConverter

    override fun configureMessageConverters(converters: MutableList<HttpMessageConverter<*>>) {
        // 先添加自定义转换器,再添加全局默认转换器
        converters.add(nullAllowedJacksonConverter)
        converters.add(MappingJackson2HttpMessageConverter())
    }
}
  1. 在目标端点指定使用自定义媒体类型:
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:16:18