package com.liftsail.testprofiledemo.controller;
import lombok.NoArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
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;
import javax.validation.constraints.NotNull;
import javax.validation.groups.Default;
import java.util.List;
/**
* @Author: liftSail
* @Date: 2025/5/7 11:43
* @Description: 不积跬步无以至千里
*/
// Bean校验先于Method方法拦截校验
@Validated // 集合参数校验需要在此注解@Validated,分组优先级低于方法上注解分组优先级
// @Validated(ValidationTestController.Group.class)
@NoArgsConstructor
@RestController
public class ValidationTestController {
/**
* 类上需要搭配@Validated使用
* javax.validation.ConstraintViolationException
*
* @param exam
* @return
*/
@GetMapping("/paramValid")
public Long paramValid(@NotNull Long exam) {
return exam;
}
/**
* org.springframework.validation.BindException
*
* @param exam
* @return
* @Valid校验针对默认分组生效,非默认分组校验不生效
*/
@GetMapping("/beanValid")
public Exam beanValid(@Valid Exam exam) {
return exam;
}
/**
* org.springframework.validation.BindException
*
* @param exam
* @return
* @Validated校验默认分组Default
*/
@GetMapping("/beanValidated")
public Exam beanValidated(@Validated Exam exam) {
return exam;
}
/**
* org.springframework.validation.BindException
*
* @param exam
* @return
* @Validated校验指定分组
*/
@GetMapping("/beanValidatedGroup")
public Exam beanValidatedGroup(@Validated(Group.class) Exam exam) {
return exam;
}
/**
* org.springframework.web.bind.MethodArgumentNotValidException
*
* @param exam
* @return
* @Validated校验默认分组Default
*/
@PostMapping("/beanPostValidated")
public Exam beanPostValidated(@RequestBody @Validated Exam exam) {
return exam;
}
/**
* org.springframework.web.bind.MethodArgumentNotValidException
*
* @param exam
* @return
* @Validated校验指定分组
*/
@PostMapping("/beanPostValidatedGroup")
public Exam beanPostValidatedGroup(@RequestBody @Validated(Group.class) Exam exam) {
return exam;
}
/**
* org.springframework.web.bind.MethodArgumentNotValidException
*
* @param exam
* @return
* @Valid校验针对默认分组生效,非默认分组校验不生效
*/
@PostMapping("/beanPostValid")
public Exam beanListValid(@RequestBody @Valid Exam exam) {
return exam;
}
/**
* 仅使用@Valid集合校验不生效,需在类上搭配注解@Validated
* javax.validation.ConstraintViolationException
*
* @param examList
* @return
*/
@PostMapping("/beanListValid")
// public List<Exam> beanListValid(@RequestBody List<@Valid Exam> examList) {
public List<Exam> beanListValid(@RequestBody @Valid List<Exam> examList) {
return examList;
}
// 校验集合@Validated放在参数上无作用,需要放在方法上,分组优先级别高于类上分组级别,放在方法上起到覆盖分组的作用,无法替代类上@Validated作用
// 方法上@Validated注解仅仅起到覆盖类上分组的作用,可不添加,结合业务场景使用
// 校验集合@Valid放在参数上里面外面均可
/**
* javax.validation.ConstraintViolationException
*
* @param examList
* @return
*/
// @Validated
@Validated(Default.class)
@PostMapping("/beanListValidGroupOut")
public List<Exam> beanListValidGroupOut(@RequestBody @Valid List<Exam> examList) {
return examList;
}
/**
* javax.validation.ConstraintViolationException
*
* @param examList
* @return
*/
// @Validated
@Validated(Group.class)
@PostMapping("/beanListValidGroupIn")
public List<Exam> beanListValidGroupIn(@RequestBody List<@Valid Exam> examList) {
return examList;
}
/**
* javax.validation.ConstraintViolationException
*
* @param examList
* @Valid在参数内外均可,同时存在也可
*/
// @Validated(Default.class)
@PostMapping("/beanListValidGroup")
// public void beanValidGroup(@RequestBody List<@Valid Exam> examList) {
public void beanValidGroup(@RequestBody @Valid List<@Valid Exam> examList) {
}
public static class Exam {
// @NotNull
// @NotNull(groups = {Group.class})
@NotNull(groups = {Group.class, Default.class})
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
public interface Group {
}
}