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

@JsonNaming与@NotNull校验注解冲突问题求助

问题根源与解决方案

这两个注解所属的库不存在冲突:@JsonNaming来自Jackson(负责JSON序列化/反序列化的字段名转换),@NotNull来自Jakarta Validation(或旧版javax.validation,负责参数校验),二者职责独立,本身不会互相干扰。

问题本质

你遇到的Bad Request是因为GET请求的Query参数绑定逻辑不识别Jackson的@JsonNaming配置:

  1. @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)仅对JSON请求体的字段生效,会把DTO的phoneNumber属性在序列化/反序列化时转换为phone_number。
  2. 但你用的是@GetMapping,请求参数是URL上的Query参数(比如?phone_number=123456),Spring MVC的Query参数绑定默认只会按属性名(驼峰phoneNumber)匹配,不会自动应用Jackson的蛇形命名策略,导致phoneNumber属性始终为null,触发@NotNull的校验规则,抛出Bad Request。

解决方案

有两种常见的处理方式:

方式1:给字段添加@JsonProperty注解(推荐)

在DTO的phoneNumber属性上添加@JsonProperty("phone_number"),让Jackson和Spring MVC的参数绑定都识别这个蛇形名称,同时兼容JSON请求体和Query参数:

@Data
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
@NoArgsConstructor
public class OTPRequestDTO {

    @NotNull
    @JsonProperty("phone_number")
    private String phoneNumber;
}

方式2:全局配置Spring MVC的参数命名策略

在Spring Boot配置文件(application.properties或application.yml)中开启Query参数的蛇形转驼峰:

# 开启请求参数的蛇形转驼峰转换
spring.mvc.servlet.init-param.convert-param-names-to-camel-case=true

这个配置会让Spring MVC自动把所有蛇形命名的Query参数转换为驼峰属性名,无需逐个字段添加注解。

验证说明

修改后,当你传递?phone_number=123456的Query参数时,Spring MVC会正确将其映射到phoneNumber属性,@NotNull校验通过,请求即可正常执行。

内容的提问来源于stack exchange,提问作者Ali Forghani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:57:20