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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:13:12