精华内容
下载资源
问答
  • JAVA的对象list参数校验
    千次阅读
    2020-05-12 18:02:54

    对于普通的对象参数校验,那很容易,直接在需要校验的属性上加上@NotNull、@NotBlank等注解即可。比如:

    public class Dog{
    	//一堆校验属性
    }
    

    然后在做参数使用时,用@Validated注解即可

    public AjaxResult<JsonNode> saveOrUpdate(@RequestBody @Validated Dog dog) throws Exception {
    
    }
    

    但是如果参数是对象组成的list,那这么做是无效的。这时的解决办法有两种:
    1)在项目里添加一个ValidList类,此类课直接使用,无需改动

    public class ValidList<E> implements List<E> {
    
        @Valid
        @Size(min = 1, message = "集合不能为空")
        @NotNull(message = "集合不能为NULL")
        private List<E> list = new ArrayList<E>();         //这几个校验是对list整体,比如是否为空集合
    
        @Override
        public int size() {
            return list.size();
        }
        /*
        * 省略一堆
        */
    

    之后在校验时只要将接口方法参数中的List改成ValidList即可:

     public AjaxResult<JsonNode> saveFixedConfig(@RequestBody @Validated ValidList<Dog> dogs) {
     }
    

    2)新建一个类,把List作为成员变量, 然后用@Valid注解在List上。

    @Data
    public class DogList {
    
        @Valid
        private List<Dog> dogs;
    
    }
    

    然后使用时和之前一样即可

    public AjaxResult<JsonNode> saveOrUpdate(@RequestBody @Validated DogList  dogList)  {
    }
    
    更多相关内容
  • Spring参数校验--List类型参数校验

    千次阅读 2019-03-06 00:05:27
    1.遇到的问题: 今天开发接口,遇到请求...发现参数校验失效。 // 控制器 @RequestMapping(value = "/saveVideo", method = RequestMethod.POST) @ResponseBody public List&lt;SaveVideoRe...

    1.遇到的问题:

    今天开发接口,遇到请求参数固定为List<SaveVideoReq>类型的,如下。发现参数校验失效。

    
        // 控制器
        @RequestMapping(value = "/saveVideo", method = RequestMethod.POST)
        @ResponseBody
        public List<SaveVideoResp> saveVideo(@Validated @RequestBody List<SaveVideoReq> req, BindingResult bindingResult) {
            // 省略业务代码
        }
    
        // VO
    public class SaveVideoReq implements Vo {
    
        private static final long serialVersionUID = 1L;
    
        @NotBlank(message = "系统编号不能为空")
        private String sysNo;
    
        @NotBlank(message = "影像类型不能为空")
        private String videoType;
    
        @NotBlank(message = "影像名称不能为空")
        private String videoName;
    }

    2.解决方案一:

    新建一个类,把List<SaveVideoReq>作为成员变量, 然后用@Valid注解在List上。

    public class SaveVideoReqWrapper implements Vo {
    
        @Valid
        private List<SaveVideoReq> req;
    
    }

    3. 解决方案二:

    但是,由于某种原因,前端只会传[{“sysNo”:“HIKID098”,“videoType”:“01”,“videoName":"高清小视频"},{...}]。因此,请求对象是固定的,不能用方案一处理。此时,可以参考网上的一个方法,创建一个类,实现List接口,并添加List<E> list = new ArrayList<>();或者LinkedList作为成员变量,如下:

    /**
     * FileName: ValidList
     * DESCRIPTION: 参数校验工具类, 用于校验List<E> 类型的请求参数
     * @author: SLY
     * @create: 2019/3/5
     */
    public class ValidList<E> implements List<E> {
    
        @Valid
        private List<E> list = new ArrayList<>();
    
        @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);
        }
    
        public List<E> getList() {
            return list;
        }
    
        public void setList(List<E> list) {
            this.list = list;
        }
    }
    

    然后,控制器的参数列表就变成了如下。此时,就可以正常从bingdingResult获取校验结果了。

    
        // 控制器
        @RequestMapping(value = "/saveVideo", method = RequestMethod.POST)
        @ResponseBody
        public List<SaveVideoResp> saveVideo(@Validated @RequestBody ValidList<SaveVideoReq> req, BindingResult bindingResult) {
            // 省略业务代码
        }

     

    展开全文
  • SpringBoot参数校验--List类型

    万次阅读 2018-11-16 11:49:52
    我们在写后台接口的时候,...但当我们的接口接收的参数List&lt;E&gt;时,可以使用本文的方法进行校验。注:工具类部分代码在最后 包含验证规则的实体类: import io.swagger.annotations.ApiModel; ...

        我们在写后台接口的时候,通常会定义DTO来接收参数,在DTO中使用注解书写验证的规则;然后在Controller层使用@validated注解来验证自己制定的校验规则。但当我们的接口接收的参数为List<E>时,可以使用本文的方法进行校验。注:工具类部分代码在最后

    包含验证规则的实体类:

    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    import javax.validation.constraints.NotBlank;
    import javax.validation.constraints.Pattern;
    @Data
    public class SingleDTO {
        @ApiModelProperty(value = "主键ID", required = true)
        @NotBlank(message = "缺少参数:主键ID")
        @Pattern(regexp = "[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}",message = "主键ID格式有误:UUID格式")
        private String pkId;
    }

     

    参数校验:

    import com.wingconn.aeocustoms.domain.dto.SingleDTO;
    import org.junit.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import javax.validation.*;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Set;
    
    public class ValidatorUtilsTest {
        private static final Logger LOGGER = LoggerFactory.getLogger(ValidatorUtilsTest.class);
    
        private static Validator createValidator() {
            Configuration<?> config = Validation.byDefaultProvider().configure();
            ValidatorFactory factory = config.buildValidatorFactory();
            Validator validator = factory.getValidator();
            factory.close();
            return validator;
        }
    
        /**
         * Controller层验证List类型的参数
         */
        @Test
        public void validate() {
            List<SingleDTO> dtos = new ArrayList<>();
            SingleDTO singleDTO =  new SingleDTO();
            singleDTO.setPkId("12345678990");
            dtos.add(singleDTO);
            Validator validator = createValidator();
            for(SingleDTO dto : dtos) {
                Set<ConstraintViolation<SingleDTO>> violations  = validator.validate(dto);
                if (violations.size() == 0) {
                    LOGGER.debug("No violations.");
                    System.out.println("success");
                }else {
                    LOGGER.error("%s violations:%n", violations.size());
                    for(ConstraintViolation<SingleDTO> violation :violations){
                        LOGGER.error("参数:"+violation.getPropertyPath() + "  " + violation.getMessage());
                    }
                }
            }
        }
    
    }

    用参数“1234567890”进行单元测试,结果为:

     

    用参数“c076de6c-aeb3-4882-ba6c-a886942c53c4”进行单元测试,结果为:

    单元测试表明该工具类可以使用。实际使用时,直接在Controller层使用该工具类,即可进行参数的校验。

    工具类部分代码(缺少了返回值的实体类): 

    package com.XXX.aasmgt.util;
    
    import com.XXX.to.resultTo.ResultTO;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import javax.validation.*;
    import java.util.List;
    import java.util.Set;
    
    /**
     * @author fusc
     * @date 2018/10/9 17:23
     */
    public class ValidatorUtils {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(ValidatorUtils.class);
    
        private static Validator createValidator() {
            Configuration<?> config = Validation.byDefaultProvider().configure();
            ValidatorFactory factory = config.buildValidatorFactory();
            Validator validator = factory.getValidator();
            factory.close();
            return validator;
        }
    
        /**
         * Controller层验证List类型的参数
         *
         * @return
         */
        public static <T> ResultTO validate(List<T> list) {
            Validator validator = createValidator();
            for (T dto : list) {
                Set<ConstraintViolation<T>> violations = validator.validate(dto);
                if (violations.size() == 0) {
                    LOGGER.debug("No violations.");
                    return ResultTO.operateSuccess();
                } else {
                    LOGGER.error("%s violations:%n", violations.size());
                    for (ConstraintViolation<T> violation : violations) {
                        LOGGER.error("参数:" + violation.getPropertyPath() + "  " + violation.getMessage());
                        return ResultTO.errorByInvalidParams(violation.getMessage());
                    }
                }
            }
            return ResultTO.errorByInvalidParams("参数有误:参数列表为空!");
        }
    }
    

    ************************************************************************************************************************************************* 

     另外一种方式( 摘抄自公众号“Java技术栈”)

    为了能够进行嵌套验证,必须手动在Item实体的props字段上明确指出这个字段里面的实体也要进行验证。由于@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且@Valid类注解上也说明了它支持嵌套验证功能,那么我们能够推断出:@Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上,来配合方法参数上@Validated或@Valid来进行嵌套验证。

    我们修改Item类如下所示:

    public class Item {
    
        @NotNull(message = "id不能为空")
        @Min(value = 1, message = "id必须为正整数")
        private Long id;
    
        @Valid // 嵌套验证必须用@Valid
        @NotNull(message = "props不能为空")
        @Size(min = 1, message = "props至少要有一个自定义属性")
        private List<Prop> props;
    }

     

    展开全文
  • 使用@Validated校验List接口参数的两种方式 注: 不仅限于两种,此处只列举了两种 创建springboot项目, 并添加 spring-boot-starter-validation jar包 <dependency> <groupId>org.springframework....

    使用@Validated校验List接口参数的两种方式

    注: 不仅限于两种,此处只列举了两种

    创建springboot项目, 并添加 spring-boot-starter-validation jar包

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    

    定义接口和参数

    @RestController
    @RequestMapping(value = "/test")
    public class TestController {
    
        @PostMapping(value = "/create")
        public String test(@RequestBody List<User> users){
            return "success";
        }
    
        @lombok.Data
        public static class User{
            @NotNull(message = "用户id不能为空")
            private Integer userId;
            @NotBlank(message = "用户名字不能为空")
            private String username;
            @NotNull(message = "薪资不能为空")
            private Double salary;
        }
    }
    

    添加校验

    1. 直接在参数列表中添加@Validated注解(无效)

      public String test(@RequestBody @Validated List<User> users)
      

      如上所示,如果我们直接在参数列表中添加校验注解,如果是User对象参数是能够校验到参数的,如果是List<User>参数校验就无效了,该注解只能校验JavaBean。

    2. 使用@Validated@Valid注解(有效)
      在Controller类上加上@Validated, 在需要校验的参数上加上 @Valid, 就可以校验list里的实体类的属性。

      @Validated
      @RestController
      @RequestMapping(value = "/test")
      public class TestController {
      
       @PostMapping(value = "/create")
       public String test(@RequestBody @Valid List<User> users){
           return "success";
       }
      }
      

    @Validated@Valid注解的区别:

    在Controller中校验方法参数时,使用@Valid和@Validated并无特殊差异(若不需要分组校验的话)。
    @Valid:标准JSR-303规范的标记型注解,用来标记验证属性和方法返回值,进行级联和递归校验。
    @Validated:Spring的注解,是标准JSR-303的一个变种(补充),提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制。
    
    方法级别:
    @Validated注解可以用于类级别,用于支持Spring进行方法级别的参数校验。
    @Valid可以用在属性级别约束,用来表示级联校验。
    @Validated只能用在类、方法和参数上,而@Valid可用于方法、字段、构造器和参数上。
    
    1. 自定义实现一个List ValidatedList, 加@Validated注解(有效)
    
    @RestController
    @RequestMapping(value = "/test")
    public class TestController {
    
        @PostMapping(value = "/create")
        public String test(@RequestBody @Validated ValidatedList<User> users){
            return "success";
        }
    }
    
    @lombok.Data
    public class ValidatedList<E> implements List<E> , Serializable {
        @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);
        }
    }
    

    展开全文
  • 嵌套校验List<对象>形式的controller接口传参方式: 接收参数使用外层对象包装List<对象>: @RestController public class TestController { @RequestMapping public Object testController(@Request...
  • Java后端发工作中经常会对前端传递过来的参数做...虽说前端也可以做参数校验,但是为了保证我们API接口的可靠性,以保证最终数据入库的正确性,后端进行参数校验不可忽视。 Hibernate Validator 提供了一种统一方便...
  • //vo public class TestVo { @NotEmpty(message="id不能为空") private String id; ........ ... //单独校验 for(TestVo testVo: list){ validator.validate(testVo,new BindException(testV.
  • 参数校验参数是否为空接口,循环判断多个参数,可以直接使用
  • 4、这样做的话,参数绑定依然能够成功,但是参数校验会失败, checker会是null   5、需要追加定义一个新的Pojo,只持有List对象,并在通过@Valid递归校验。   class PersonInputList { @Valid ...
  • 在调用API接口时,参数存在list集合,要对参数对象进行校验是否有重复数据。 list.stream().distinct().count(); 代码示例: public class CheckListObject { public static void main(String[] args) { ...
  • Spring Boot 实体里的List集合参数验证

    千次阅读 2021-09-02 09:26:21
    Spring Boot 实体里的List集合...1、 List参数上加@Valid public class OrderSaveDTO { @Valid @ApiModelProperty("订单商品信息集合") @NotEmpty(message = "订单商品信息集合不能为空") private List<OrderGoods
  • Validated参数校验 List

    2021-11-19 14:13:19
    接口入参需要各种校验,springboot里的validate非常好用 <dependency> <groupId>org.springframework.boot<...但是之前写的一个接口参数校验没问题,后来突然不生效了。 接口入参是 List<E&g
  • 校验列表List方法一:方法二方法三 方法一: 在controller层加上@Validated注解 在方法参数使用@valid注解即可 参考 方法二 包装一层List 方法三 自定义一层List
  • 在Controller中校验方法参数时,使用@Valid和@Validated并无特殊差异(若不需要分组校验的话):@Valid:标准JSR-303规范的标记型注解,用来标记验证属性和方法返回值,进行级联和递归校验@Validated:Spring的注解,...
  • 1. 为什么需要参数校验 在日常的接口开发中,为了防止非法参数对业务造成影响,经常需要对接口的参数做校验,例如登录的时候需要校验用户名密码是否为空,创建用户的时候需要校验邮件、手机号码格式是否准确。靠代码...
  • SpringBoot 如何进行参数校验,老鸟们都这么玩的!

    千次阅读 多人点赞 2021-08-12 08:51:38
    》阅读效果还不错,而且被很多号主都转载过,今天我们继续第二篇,来聊聊在SprinBoot中如何集成参数校验Validator,以及参数校验的高阶技巧(自定义校验,分组校验)。 此文是依赖于前文的代码基础,已经在项目中...
  • java参数校验

    千次阅读 2021-11-16 23:04:39
    这里写目录标题1、传统的参数校验方式搭建项目结构2、开始使用validator3、级联验证(一对一、一对多)3.1 规范返回值 1、传统的参数校验方式 搭建项目结构 在entity包下创建Deparement实体类 @Data @ToString @...
  • SpringBoot 实现各种参数校验

    千次阅读 2021-12-14 09:28:18
    requestBody参数校验 requestParam/PathVariable参数校验 统一异常处理 进阶使用 分组校验 嵌套校验 集合校验 自定义校验 编程式校验 快速...
  • java后台参数校验 一. 单个参数的校验方式 实现原理:@ControllerAdvice,@Validated注解对参数进行校验 实现方式: 1.创建统一的系统常量 package com.hm.middle_service.common; /** * @Author:huangzhimin * ...
  • SpringBoot使用validation-api实现对枚举类参数校验 前言 之前写了一个博客是关于使用SpringBoot使用validation-api实现参数校验,当时使用的注解都是validation-api自带的注解只能完成对空值、长度等简单的校验,在...
  • 文章目录Pre概述 Pre SpringBoot - 优雅的实现参数校验高级进阶 概述
  • java接口参数校验

    千次阅读 2021-03-21 09:33:26
    (可扩充) 命令编号 命令名称 参数命令 提取现场机时间 上传现场机时间 设置现...接口标准》 (以下简称“接口标准” ) 《数据对接接口校验规则》 《RC020-ICD-10 诊断编码》 《RC021-ICD-10 形态学编码》 《RC022-ICD...
  • java 参数校验 详解

    千次阅读 2021-04-27 16:21:01
    Java参数校验 参考:https://www.cnblogs.com/virgosnail/p/11556979.html ​ https://blog.csdn.net/yudian1991/article/details/111146689 介绍及使用 描述:Javax.validation是spring集成自带的一个参数校验...
  • 对于不同的参数解析方式,Spring 抛出的异常也不同,而且这些异常没有继承关系,异常的内部也各不相同,只能对每种异常单独处理。感觉这块地方 spring 没有设计好,处理起来比较麻烦。跟参数相关的异常主要有三个...
  • Java参数校验

    千次阅读 2019-01-23 16:19:56
    基本步骤 引入pom依赖 ...-- 参数校验 --&amp;amp;gt; &amp;amp;lt;!-- start --&amp;amp;gt; &amp;amp;lt;dependency&amp;amp;gt; &amp;amp;lt;groupId&amp;amp;gt
  • Spring参数校验之集合

    2021-11-15 21:58:37
    集合校验 public class ValidateList<E> implements List<E> { @Valid @NotEmpty(message = "至少得有一个元素,长度必须大于1") private List<E> list; public ValidateList() { ...
  • 为安全考虑,我们开发经常会需要进行参数校验,这里简单记录下Springboot的方式。话不多说我们直接开始,首先创建一个实体类: import lombok.Data; import org.hibernate.validator.constraints.Length; import org...
  • SpringBoot里参数校验/参数验证

    万次阅读 多人点赞 2019-05-08 13:47:56
    在控制器类的方法里自己写校验逻辑代码当然也可以,只是代码比较丑陋,有点“low”。业界有更好的处理方法,分别阐述如下。 2、PathVariable校验 @GetMapping("/path/{group:[a-zA-Z0-9_]+}/{userid}") @...
  • Spring Boot实现参数校验 参数校验的目的 不做参数校验带来的问题: 入库异常(数据库字段长度为50,实际数据长度为100) NPE异常(未接收到参数就进行调用) 被同事嫌弃(500行代码,250行都在用if…esle做参数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 130,497
精华内容 52,198
关键字:

list参数校验

友情链接: Tcp-Connect.zip