validate注解做校验

本文介绍了在Spring MVC中使用Hibernate Validation进行数据校验的方法,包括常见校验注解、分组校验、自定义注解的实现及@Valid与@Validated的区别。通过示例展示了在控制器中如何进行校验并处理校验结果,以及如何通过AOP简化校验逻辑。

前言

之前也用过hibernate的校验注解,但是没有去做一个总结,这里参考一篇博客去做一个总结。简述JSR303/JSR-349,hibernate validation,spring validation之间的关系。JSR303是一项标准,JSR-349是其的升级版本,添加了一些新特性,他们规定一些校验规范即校验注解,如@Null,@NotNull,@Pattern,他们位于javax.validation.constraints包下,只提供规范不提供实现。而hibernate validation是对这个规范的实践(不要将hibernate和数据库orm框架联系在一起),他提供了相应的实现,并增加了一些其他校验注解,如@Email,@Length,@Range等等,他们位于org.hibernate.validator.constraints包下。而万能的spring为了给开发者提供便捷,对hibernate validation进行了二次封装,显示校验validated bean时,你可以使用spring validation或者hibernate validation,而spring validation另一个特性,便是其在springmvc模块中添加了自动校验,并将校验信息封装进了特定的类中。这无疑便捷了我们的web开发。本文主要介绍在springmvc中自动校验的机制。

引入依赖

因为我们构建的是spring boot项目,所以直接引入web的starter的依赖即可。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

如果查看其子依赖,可以发现如下的依赖:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

进行校验

校验的实体类

这里用了lombok的@Data注解,也是非常推荐大家使用的一个插件。

@Data
public class ValidateBO {

    @NotBlank(message = "name不能为空")
    private String name;

    @Min(value = 18, message = "年龄不能小于18岁")
    private Integer age;

    @Email(message = "email格式错误")
    private String email;

    /**
     * 自定义注解 不能包含空格字符串
     */
    @CannotHaveBlank
    private String blank;

    /**
     * 正则校验
     */
    @Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$", message = "手机号码格式错误")
    private String phone;

}

可以看到这里用到了一些常见的注解。(自定义校验注解在下边会提到)

controller进行校验

在controller中进行这个字段的校验,可以看到每个需要校验的对象,都需要一个BindingResult去承接校验的结果,并且也要对要校验的类去加上@Validated注解。

 @GetMapping(value = "/validate")
    public String validate(ValidateBO validateBO, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            StringBuilder stringBuilder = new StringBuilder();
            for (String s : bindingResult.getFieldErrors().stream()
                    .map(FieldError::getDefaultMessage).collect(Collectors.toList())) {
                stringBuilder.append(s);
            }
            return stringBuilder.toString();
        }
        return "success";
    }

启动项目,在url中输入对项目进行debug。
debug这次请求
可以看到,校验在碰到第一个字段不符合要求之后,并不是直接返回错误,而是会对所有的要校验字段去校验。当然这个也是可以配置的,下边会提到fast-fail的配置。最后返回的结果:

这里是打印出了这个对象中所有的错误。

常见的校验注解

JSR提供的校验注解:

@Null   被注释的元素必须为 null    
@NotNull    
在 Spring 框架中,参数校验是构建健壮、安全和可维护的 Web 应用程序的重要组成部分。Spring 提供了多种方式来实现参数校验,主要包括标准的 Bean Validation 注解(如 `@Valid`)以及 Spring 扩展的 `@Validated` 注解。此外,还可以结合自定义注解和 AOP 技术来实现更灵活的校验逻辑。 ### 参数校验的基本实现方式 1. **使用 `@Valid` 注解** `@Valid` 是 JSR-303(Bean Validation 1.0)和 JSR-349(Bean Validation 1.1)标准的一部分,主要用于在方法参数上进行对象图的字段级校验。 示例代码如下: ```java public class UserDTO { @NotBlank(message = "姓名不能为空") private String name; @Email(message = "邮箱格式错误") private String email; @Min(value = 18, message = "年龄必须≥18岁") private int age; } @RestController public class UserController { @PostMapping("/users") public ResponseEntity createUser(@RequestBody @Valid UserDTO user) { // 校验通过后执行业务逻辑 return ResponseEntity.ok("用户创建成功"); } } ``` 上述代码中,`@NotBlank`、`@Email` 和 `@Min` 是常用的字段约束注解,用于对 `UserDTO` 的字段进行校验[^1]。 2. **嵌套对象校验** 在处理嵌套对象时,需要在嵌套字段上添加 `@Valid` 注解以触发嵌套对象的校验逻辑: ```java public class OrderDTO { @Valid private List<OrderItem> items; } public class OrderItem { @NotNull private Long productId; @Min(1) private Integer quantity; } ``` 通过这种方式,Spring 可以递归地对整个对象图进行校验[^1]。 3. **使用 `@Validated` 注解** `@Validated` 是 Spring 提供的扩展注解,支持类级别的校验,并且可以在非控制器类中使用(如 Service 层)。它支持分组校验和方法级别的校验。 示例: ```java @Service @Validated public class UserService { public void validateUser(@Valid UserDTO user) { // 校验逻辑 } } ``` `@Validated` 可以与 `@Valid` 配合使用,实现更灵活的校验逻辑。 4. **自定义校验注解与 AOP 结合** 除了使用内置注解外,还可以定义自定义校验逻辑。例如,结合 Aviator 表达式引擎实现动态校验: 自定义注解定义如下: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface AviatorValidation { String expression(); String errorMessage() default "参数不符合要求"; } ``` 然后通过 AOP 切面实现具体的校验逻辑,例如解析表达式并验证参数值是否符合规则[^2]。 ### 常用校验注解说明 - `@NotNull`:适用于所有类型,用于确保对象不为 null。 - `@NotBlank`:仅适用于字符串类型,确保字符串不为空白(如空格、换行等)。 - `@NotEmpty`:适用于字符串、集合、数组等类型,确保对象不为 null 且不为空。 - `@Min` / `@Max`:用于数值类型,限制最小值和最大值。 - `@Email`:用于校验邮箱格式。 - `@Size`:用于集合、字符串、数组等,限制大小范围[^3]。 ### 校验异常处理 在 Spring MVC 中,可以通过 `@ControllerAdvice` 或 `@ExceptionHandler` 捕获 `MethodArgumentNotValidException` 异常,并统一返回错误信息: ```java @ControllerAdvice public class ValidationHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<String> handleValidationExceptions(MethodArgumentNotValidException ex) { return ResponseEntity.badRequest().body(ex.getBindingResult().getAllErrors().get(0).getDefaultMessage()); } } ``` 该机制可以有效提升 API 的健壮性和用户体验。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值