Spring Controller未对Java Model执行校验问题求助
问题分析与解决方案
核心问题原因
校验不生效主要来自三个关键问题:Model注解错误使用、冗余注解干扰、基本类型的默认值特性。
1. 基本类型字段的校验注解误用
ano和duracao是int基本类型,默认值为0,永远不会为null,而@NotEmpty、@NotBlank、@Size都是针对字符串类型的校验注解,对int完全不起作用。
2. 冗余的@Valid注解
Model中的id、nomeArtista字段添加了@Valid,这个注解是用于嵌套对象校验的(比如对象里包含另一个需要校验的子对象),普通字段不需要添加,属于冗余配置。
3. 重复注解无意义
@NotBlank已经包含了@NotEmpty的校验逻辑(不仅非空,还会过滤空白字符),重复添加只会增加代码冗余,不会增强校验效果。
解决方案
步骤1:修正Model的校验注解
将基本类型改为包装类(Integer),替换为适合数值类型的校验注解,移除冗余配置:
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @NotBlank(message ="o nome não pode ser null") @Size(min=1, max=32) @Column(name = "nome_artista") private String nomeArtista; @NotBlank(message ="o nome não pode ser null") @Size(min=1, max=40) @Column(name = "nome_album") private String nomeAlbum; @NotNull(message ="o ano não pode ser null") @Min(value = 1000, message = "ano deve ter 4 dígitos") @Max(value = 9999, message = "ano deve ter 4 dígitos") @Column(name = "ano") private Integer ano; @NotBlank(message ="o genero não pode ser null") @Size(min=3, max=20) @Column(name = "genero") private String genero; @NotNull(message ="a duracao não pode ser null") @Max(value = 999, message = "duracao não pode exceder 3 dígitos") @Column(name = "duracao") private Integer duracao;
步骤2:确保校验依赖齐全
Spring Boot 2.3.x及以上版本,spring-boot-starter-validation不再默认包含在web依赖中,需要手动添加:
Maven(pom.xml)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
Gradle(build.gradle)
implementation 'org.springframework.boot:spring-boot-starter-validation'
步骤3:优化Controller的错误返回逻辑
当前错误返回的HttpStatus.FORBIDDEN(403)语义不准确,建议改为HttpStatus.BAD_REQUEST(400),更符合参数校验失败的场景:
if (result.hasErrors()){ // 可选:返回具体错误信息,而非仅状态码 return new ResponseEntity<>(HttpStatus.BAD_REQUEST); }
验证效果
修正后重新测试:
- 当
nomeArtista为空或超出长度时,请求触发校验错误,返回400 - 当
ano为null、小于1000或大于9999时,校验生效 - 当
duracao为null或大于999时,校验生效
内容的提问来源于stack exchange,提问作者southzonehorror
相关产品推荐
相关产品推荐

