Java参数校验Validation,SpringBoot中使用@Valid@Validated注解

为了避免复杂的if/else校验,可以使用@Valid/@Validated注解来简化,使之更美观。

当使用@Valid或@Validated注解来触发校验时,如果校验失败,Spring会抛出异常。

  • 可以使用@RestControllerAdvice注解来定义一个全局异常处理器来捕获MethodArgumentNotValidException
  • 也可以在Controller的方法中添加BindingResult参数来直接访问校验结果

使用步骤:

  1. 添加依赖,springboot项目无需添加,已经包含spring-boot-starter-web中
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>
 
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.4.1.Final</version>
</dependency>

  1. 实体类中添加@Valid相关注解
public class StudentDTO {
	//新增组
    public interface addGroup{

    }

	//更新组
    public interface updateGroup{

    }

    @NotBlank(message = "id不能为空", groups = {updateGroup.class})
    private String id;

    @NotBlank(message = "人名不能为空", groups = {addGroup.class})
    private String name;

	@NotBlank(message = "地址不能为空")//这里没给分组,想要起作用,下面的接口中要加Default.class
	private String address;

}
  1. 接口类中添加@Valid注解(因为使用了分组,所以使用的是@Validated)
@PostMapping("/addStudent")
R addStudent(@RequestBody @Validated({StudentDTO.addGroup.class, Default.class}) StudentDTO dto) {
     return StudentService.addStudent(dto);
}
    
@PutMapping("/updateStudent")
R updateStudent(@RequestBody @Validated({StudentDTO.updateGroup.class}) StudentDTO dto) {
     return StudentService.updateStudent(dto);
}

  1. 全局异常处理抛出的异常 或者 直接在接口方法中处理
    ps:下面的JsonResult是项目中的统一结果集响应的实体类,换掉即可

全局异常处理:

@RestControllerAdvice
public class MapExceptionHandler{
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public JsonResult handlerEx(MethodArgumentNotValidException ex) {
        List<ObjectError> allErrors = ex.getBindingResult().getAllErrors();
        List<String> resultList = new ArrayList<>();
        for (ObjectError objectError : allErrors) {
            resultList.add(objectError.getDefaultMessage());

        }
        return new JsonResult().error(String.join(",", resultList));
    }
}

或者
直接在接口方法中处理:

@RestController
public class StudentController {

	@PostMapping("/addStudent")
	R addStudent(@RequestBody @Validated({StudentDTO.addGroup.class}) StudentDTO dto, BindingResult bindingResult) {
		if (bindingResult.hasErrors()) {
        	String message = bindingResult.getAllErrors().get(0).getDefaultMessage();
        	return R.error(message);
    	}
    	
     	return StudentService.addStudent(dto);
	}
}

附:

一些常用的参数校验注解

@Null:为null

@NotNull:不为null

@NotEmpty:不为null,且长度必须大于0,用于集合校验

@NotBlank:不为null,并且经过trim操作后,字符串长度也大于0,用于String校验

@Min(value):必须是一个数(可以为数值类型或String类型,其中数值类型建议使用包装类),且其值>=指定的最小值

@Min(value = 18, message = "必须大于等于18")
private Integer age;

@Max(value):必须是一个数(可以为数值类型或String类型,其中数值类型建议使用包装类),且其值<=指定的最大值。

@Range(max =3 , min =1):必须是一个数(可以为数值类型或String类型,其中数值类型建议使用包装类),且是否介于(包括)指定的最小值和最大值之间

@Range(min = 10, max = 20, message = "年龄必须在10-20之间")
private Integer age;

@Size(max,min):验证对象(Array,Collection,Map,String)长度是否在给定的范围之内。

@Size(min = 10, max = 20, message = "长度必须在10-20之间")
private String name;

@Email:验证注解的元素是否是一个有效的email地址。

也可以自定义注解,因为本人暂时没用到,所以先不写。

可以参考别的大佬写的:
https://blog.csdn.net/m0_58680865/article/details/127817779

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值