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;
    }
}

说明:

  • 全局异常处理器确保了当校验失败时,客户端能够收到统一格式的错误响应。

总结

  1. 自动校验: 在大多数情况下,如果 VO 类的字段使用了校验注解,并且控制器方法中使用了 @Valid 注解,Spring 会自动完成参数校验,无需手动检查。

  2. 手动校验: 在需要复杂的业务逻辑或条件性校验时,可以补充手动校验逻辑。

  3. 全局异常处理: 建议使用全局异常处理器来捕获和处理自动校验失败的异常,以提高代码的健壮性和可维护性。

通过这种方式,参数校验能够高效且系统化地进行,减少代码冗余,并确保应用的可靠性。

posted @   槑孒  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
历史上的今天:
2022-08-26 ArcGIS API for JavaScript 3.x与4.x 去除ESRI logo的方法
点击右上角即可分享
微信分享提示