使用validation进行校验分组group以及对于不符合校验的处理

本文详细介绍了在Java中如何利用Bean Validation的校验分组功能,实现不同场景下的数据验证,如分组校验group,以及针对校验失败后的错误处理策略,帮助开发者提高代码的健壮性和用户体验。
为什么要分组?
案例:在添加时,前端传到后端的对象是没有id值的,
	 而在修改时,前端传到后端时有id值的,那么将无法进行校验,
	 因为你不管规定有值或者无值,另一方必然无法满足	
	 此时,我们需要进行分组即可解决问题
	 
如何定义组:一个组就是一个接口,随便定义

如何分组:1,在属性注解中设置属性groups=接口.class
		2,在方法形参中@Validated(接口.class)
示例:

在这里插入图片描述
在这里插入图片描述

当然,如果我们在形参中设置了分组,那么没有在这个组中的其他校验就不会生效,
所以我们还需要把其他属性的校验一并加入到组中

当不符合校验时,后台会有一个异常,我们的处理可以使用捕获这个异常,然后处理,
返回给前端我们在校验时定义好的message

在这里插入图片描述

package com.sm.qy28.exception;

import com.sm.qy28.common.http.AxiosResult;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
//返回json格式
@RestControllerAdvice
public class MyExceptionHander  {
    //捕获这类的异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    //返回map集合
    public AxiosResult<Map<String,String>> hander(MethodArgumentNotValidException e){
        HashMap<String, String> hashMap = new HashMap<>();
        BindingResult bindingResult = e.getBindingResult();
        //判断是否有错误
        if( bindingResult.hasErrors()){
            //把错误放到集合中
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            for (int i = 0; i < fieldErrors.size(); i++) {
                hashMap.put(fieldErrors.get(i).getField(),fieldErrors.get(i).getDefaultMessage());
            }
        }
        return AxiosResult.success(EnumStatus.JIAOYAN_ERROR,hashMap);
    }
}
### Java Group 分组校验 注解 使用方法 或 实现原理 Java 中的分组校验机制允许开发者根据同的业务场景对参数进行校验。以下是关于 `Group` 分组校验注解的使用方法及其实现原理。 #### 1. 分组校验的基本概念 分组校验是通过定义接口来表示同的校验规则集合。这些接口通常作为分组标记,用于区分同的校验逻辑[^2]。例如,可以为插入、更新、查询等操作分别定义同的分组。 #### 2. 定义分组接口 分组接口可以通过继承 `javax.validation.groups.Default` 来扩展默认分组,也可以独立定义。以下是一个示例: ```java import javax.validation.groups.Default; public interface ValidParameterGroup extends Default { interface Insert {} interface Update {} interface Query {} interface Delete {} } ``` 上述代码中,`ValidParameterGroup` 定义了四个分组:`Insert`、`Update`、`Query` 和 `Delete`,分别对应同的业务场景[^2]。 #### 3. 在校验注解中指定分组校验字段时,可以通过 `groups` 属性指定需要应用的分组。例如: ```java import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; public class User { @NotBlank(groups = {ValidParameterGroup.Insert.class, ValidParameterGroup.Update.class}) private String name; @Size(min = 18, max = 150, groups = ValidParameterGroup.Query.class) private String ageRange; // getters and setters } ``` 在上述代码中,`name` 字段在 `Insert` 和 `Update` 分组中必须非空,而 `ageRange` 字段仅在 `Query` 分组中进行长度校验[^2]。 #### 4. 自定义校验器中的分组获取 如果实现了一个自定义校验器(继承 `ConstraintValidator` 接口),可以通过 `ConstraintValidatorContext` 获取当前的分组信息。例如: ```java import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class CustomValidator implements ConstraintValidator<CustomAnnotation, String> { @Override public boolean isValid(String value, ConstraintValidatorContext context) { Set<Class<?>> groups = context.getConstraintDescriptor().getGroups(); if (groups.contains(ValidParameterGroup.Insert.class)) { // 执行 Insert 分组校验逻辑 } else if (groups.contains(ValidParameterGroup.Update.class)) { // 执行 Update 分组校验逻辑 } return true; } } ``` 上述代码展示了如何在自定义校验器中获取当前分组信息,并根据分组执行同的校验逻辑[^1]。 #### 5. Spring Boot 中的分组校验 在 Spring Boot 中,可以使用 `@Validated` 注解结合分组接口实现参数校验。例如: ```java import org.springframework.validation.annotation.Validated; import javax.validation.Valid; @RestController public class UserController { @PostMapping("/user") public ResponseEntity<String> createUser(@Validated(ValidParameterGroup.Insert.class) @RequestBody User user) { return ResponseEntity.ok("User created successfully"); } @PutMapping("/user/{id}") public ResponseEntity<String> updateUser(@Validated(ValidParameterGroup.Update.class) @RequestBody User user) { return ResponseEntity.ok("User updated successfully"); } } ``` 在上述代码中,`createUser` 方法仅对 `Insert` 分组进行校验,而 `updateUser` 方法则针对 `Update` 分组进行校验[^3]。 #### 6. 分组校验的实现原理 分组校验的核心在于通过 `groups` 属性动态指定校验规则的适用范围。当调用校验框架时,会根据指定的分组筛选出对应的校验规则并逐一执行。具体实现依赖于 `Validator` 接口及其相关 SPI 的支持[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值