普通参数校验、对象参数校验、集合参数校验、分组校验关于@Valid、@Validated注解使用情况代码测试应用

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

}

 

posted @ 2025-05-07 14:42  liftsail  阅读(118)  评论(0)    收藏  举报