使用@Validated和@Valid 解决list校验的问题

目录
  • @Validated和@Valid 解决list校验
  • @validated验证List参数
    • 写了个接口
    • ValidList

@Validated和@Valid 解决list校验

在 Controller 类上 加上@Validated。在需要校验的参数上加上 @Valid 。

就可以校验list里的实体类的属性

@validated验证List参数

写了个接口

@GetMapping("/do")
public int doSth(@RequestBody @Validated(MyGroup.class) List<Bean> myBean)

发现@validated完全没用,但是用@valid可以,但是我要用分组功能必须用@validated,在stackOverflow上找到了解决方案

在项目里添加一个ValidList类即可,此类通用,可以在全部由此需求的项目(jdk1.8)中添加,无需改动,有ValidList类之后只要将接口方法参数中的List改成ValidList即可:

@GetMapping("/do")
public int doSth(@RequestBody @Validated(MyGroup.class) ValidList<Bean> myBean)

注意:

如果你不用lombok,就把@Data注解去掉,给类中的list成员加上getter,setter方法即可

ValidList

import lombok.Data;
import javax.validation.Valid;
import java.util.*;
@Data
public class ValidList<E> implements List<E> {
  @Valid
  private List<E> list = new LinkedList<>();
  @Override
  public int size() {
    return list.size();
  }
  @Override
  public boolean isEmpty() {
    return list.isEmpty();
  }
  @Override
  public boolean contains(Object o) {
    return list.contains(o);
  }
  @Override
  public Iterator<E> iterator() {
    return list.iterator();
  }
  @Override
  public Object[] toArray() {
    return list.toArray();
  }
  @Override
  public <T> T[] toArray(T[] a) {
    return list.toArray(a);
  }
  @Override
  public boolean add(E e) {
    return list.add(e);
  }
  @Override
  public boolean remove(Object o) {
    return list.remove(o);
  }
  @Override
  public boolean containsAll(Collection<?> c) {
    return list.containsAll(c);
  }
  @Override
  public boolean addAll(Collection<? extends E> c) {
    return list.addAll(c);
  }
  @Override
  public boolean addAll(int index, Collection<? extends E> c) {
    return list.addAll(index, c);
  }
  @Override
  public boolean removeAll(Collection<?> c) {
    return list.removeAll(c);
  }
  @Override
  public boolean retainAll(Collection<?> c) {
    return list.retainAll(c);
  }
  @Override
  public void clear() {
    list.clear();
  }
  @Override
  public E get(int index) {
    return list.get(index);
  }
  @Override
  public E set(int index, E element) {
    return list.set(index, element);
  }
  @Override
  public void add(int index, E element) {
    list.add(index, element);
  }
  @Override
  public E remove(int index) {
    return list.remove(index);
  }
  @Override
  public int indexOf(Object o) {
    return list.indexOf(o);
  }
  @Override
  public int lastIndexOf(Object o) {
    return list.lastIndexOf(o);
  }
  @Override
  public ListIterator<E> listIterator() {
    return list.listIterator();
  }
  @Override
  public ListIterator<E> listIterator(int index) {
    return list.listIterator(index);
  }
  @Override
  public List<E> subList(int fromIndex, int toIndex) {
    return list.subList(fromIndex, toIndex);
  }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • @Validated验证List集合的方法示例

    在开发时发现,@Validated只能验证单个实体类,在验证List集合时则不生效 @PostMapping(value="/test") public ApiResult getRepaymentPlan(@RequestBody @Validated List<Test> repaymentPlanVOs){ } 经过查资料得知,@valid是可以使用的,我们自定义一个ValidList类来替换List就可以达到验证的目的,话不多说,直接看代码 public class

  • 详解Spring 参数验证@Validated和@Valid的区别

    Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303 规范,是标准 JSR-303 的一个变种),javax提供了@Valid(标准JSR-303规范),配合 BindingResult 可以直接提供参数验证结果.其中对于字段的特定验证注解比如 @NotNull 等网上到处都有,这里不详述 在检验 Controller 的入参是否符合规范时,使用 @Validated 或者 @Valid 在基本验证功能上没有太多区别.但是在分组.

  • Spring @Valid @Validated实现验证

    对于属性的验证有如下一些注解 @NotBlank:只用在String上,值不能为null,并且trim后长度大于零.不为null,不是全为空格的字符串 @NotNull: 不能为null,但可以是长度为零的字符串 @NotEmpty: 不能为null,长度大于零 @Null:必须为null @Min(value): 数字,值必须大于等于指定的值 @Max(value): 数字,值必须小雨等于指定的值 @DecimalMin(value): 数字,值必须大于等于指定的值 @DecimalMax(v

  • Springboot @Validated和@Valid的区别及使用详解

    概述: @Valid是使用Hibernate validation的时候使用 @Validated是只用Spring Validator校验机制使用 说明:java的JSR303声明了@Valid这类接口,而Hibernate-validator对其进行了实现 @Validation对@Valid进行了二次封装,在使用上并没有区别,但在分组.注解位置.嵌套验证等功能上有所不同,这里主要就这几种情况进行说明. 注解位置: @Validated:用在类型.方法和方法参数上.但不能用于成员属性(fie

  • 使用@Validated和@Valid 解决list校验的问题

    目录 @Validated和@Valid 解决list校验 @validated验证List参数 写了个接口 ValidList @Validated和@Valid 解决list校验 在 Controller 类上 加上@Validated.在需要校验的参数上加上 @Valid . 就可以校验list里的实体类的属性 @validated验证List参数 写了个接口 @GetMapping("/do") public int doSth(@RequestBody @Validated(

  • @Validated和@Valid三种异常捕获处理方式

    目录 @Validated和@Valid异常捕获 异常共三种 @Valid和@Validated区别 注解位置 @Validated和@Valid异常捕获 异常共三种 BindException:表单提交有效,对于以json格式提交将会失效 MethodArgumentNotValidException:前段以json格式有效 ConstraintViolationException :参数上加@RequestParam或参数加@NotBlank @NotNull等 @Valid和@Valida

  • Java中Validated、Valid 、Validator区别详解

    目录 1. 结论先出 JSR 380 Valid VS Validated 不同点? Validator 2. @Valid和​​​​​​​@Validated 注解 3. 例子 4.使用@Valid嵌套校验 5. 组合使用@Valid和@Validated 进行集合校验 6. 自定义校验 自定义约束注解 工作原理 结论 参考链接: 1. 结论先出 Valid VS Validated 相同点 都可以对方法和参数进行校验 @Valid和@Validated 两种注释都会导致应用标准Bean验证.

  • SpringBoot @Validated注解实现参数分组校验的方法实例

    前言 在前后端分离开发的时候我们需要用到参数校验,前端需要进行参数校验,后端接口同样的也需要,以防传入不合法的数据. 1.首先还是先导包,导入pom文件. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 2.解释一下注解的作用 @N

  • Spring中@Validated和@Valid区别浅析

    目录 基本概念 @Valid和@Validated 批注 主要区别 什么是嵌套验证? 总结 基本概念 Spring Validation 验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果.其中对于字段的特定验证注解,比如@NotNull. @Valid和@Validated 批注 在Spring中,我们使用JSR

  • 快速校验实体类时,@Valid,@Validated,@NotNull注解无效的解决

    目录 校验实体类参数内容不能为空时使用注解校验无效 使用@valid注解首先引入依赖 1.更换方法入参类型 2.错误内容过多 3.使用对象接收错误内容,按自己要求输出 springboot 校验机制 @Validated @Valid 1.探究原因 2.使用@Validated 实现校验机制 3.使用@Valid 实现校验机制 校验实体类参数内容不能为空时使用注解校验无效 使用@valid注解首先引入依赖 如果是SpringBoot项目,引入web开发包,就不需要再单独引入@valid依赖了.因

  • Java中的三种校验注解的使用(@Valid,@Validated和@PathVariable)

    目录 @Valid和@Validated @Valid和@Validated比较 @Valid高级使用 @Valid级联校验 @Validated高级使用 @Validated分组校验 @Validated分组校验顺序 @Validated非实体类校验 @PathVariable 正则表达式校验 继承BasicErrorController类 自定义校验注解 @Valid和@Validated @Valid和@Validated比较 相同点: @Valid注解和 @Validated注解都是开启

  • Springboot使用@Valid 和AOP做参数校验及日志输出问题

    项目背景 最近在项目上对接前端的的时候遇到了几个问题 1.经常要问前端要请求参数 2.要根据请求参数写大量if...else,代码散步在 Controller 中,影响代码质量 3.为了解决问题1,到处记日志,导致到处改代码 解决方案 为了解决这类问题,我使用了@Valid 做参数校验,并使用AOP记录前端请求日志 1.Bean实体类增加注解 对要校验的实体类增加注解,如果实体类中有List结构,就在List上加@Valid @Valid注解 注解 备注 @Null 只能为null @NotNu

随机推荐