Spring Boot 中 VO 类参数校验
Spring Boot 中的参数校验
在 Spring Boot 开发中,通常需要确保前端传递的请求参数符合预期格式,尤其是对于 VO(Value Object)类中的必填字段。如果某个字段未传递或为空值,可能会导致业务逻辑错误。以下是实现必接收参数校验的常用方法。
1. 使用 @Valid
进行自动校验
场景: 如果 VO 类的字段都已经使用了诸如 @NotNull
、@NotBlank
、@NotEmpty
等校验注解,并且你在控制器方法中使用了 @Valid
注解,Spring 会自动校验传入的对象,确保它们满足这些约束。
示例代码:
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
public class MyVo {
@NotNull(message = "字段1不能为空")
private String field1;
@NotBlank(message = "字段2不能为空且不能是空白字符串")
private String field2;
// getter/setter 方法
}
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@RestController
public class MyController {
@PostMapping("/my-endpoint")
public String myEndpoint(@RequestBody @Valid MyVo myVo) {
// 如果 myVo 中的字段通过了校验,代码将继续执行
return "成功";
}
}
说明:
@Valid
会触发对MyVo
的自动校验。如果字段不符合约束,Spring 将抛出MethodArgumentNotValidException
异常,并终止方法执行。- 这种方法适用于绝大多数参数校验需求。
2. 手动校验参数的场景
场景: 当校验逻辑较为复杂,或者需要根据不同条件进行不同的校验时,手动校验可能是必要的。此时,你可以在控制器方法中自行编写校验逻辑。
示例代码:
@PostMapping("/my-endpoint")
public String myEndpoint(@RequestBody MyVo myVo) {
if (myVo.getField1() == null) {
throw new IllegalArgumentException("字段1不能为空");
}
if (myVo.getField2() == null || myVo.getField2().trim().isEmpty()) {
throw new IllegalArgumentException("字段2不能为空且不能是空白字符串");
}
// 继续处理业务逻辑
return "成功";
}
说明:
- 手动校验适用于需要根据业务逻辑进行更复杂或条件性校验的情况。
- 与
@Valid
配合使用时,手动校验通常只用于处理那些注解无法涵盖的复杂场景。
3. 全局异常处理器
场景: 使用 @Valid
自动校验时,Spring 会抛出 MethodArgumentNotValidException
异常。为了统一处理这些异常,可以编写一个全局异常处理器,捕获这些异常并返回友好的错误信息。
示例代码:
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getFieldErrors().forEach(error ->
errors.put(error.getField(), error.getDefaultMessage()));
return errors;
}
}
说明:
- 全局异常处理器确保了当校验失败时,客户端能够收到统一格式的错误响应。
总结
-
自动校验: 在大多数情况下,如果 VO 类的字段使用了校验注解,并且控制器方法中使用了
@Valid
注解,Spring 会自动完成参数校验,无需手动检查。 -
手动校验: 在需要复杂的业务逻辑或条件性校验时,可以补充手动校验逻辑。
-
全局异常处理: 建议使用全局异常处理器来捕获和处理自动校验失败的异常,以提高代码的健壮性和可维护性。
通过这种方式,参数校验能够高效且系统化地进行,减少代码冗余,并确保应用的可靠性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2022-08-26 ArcGIS API for JavaScript 3.x与4.x 去除ESRI logo的方法