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

目录
  • 校验实体类参数内容不能为空时使用注解校验无效
    • 使用@valid注解首先引入依赖
    • 1、更换方法入参类型
    • 2、错误内容过多
    • 3、使用对象接收错误内容,按自己要求输出
  • springboot 校验机制 @Validated @Valid
    • 1、探究原因
    • 2、使用@Validated 实现校验机制
    • 3、使用@Valid 实现校验机制

校验实体类参数内容不能为空时使用注解校验无效

使用@valid注解首先引入依赖

如果是SpringBoot项目,引入web开发包,就不需要再单独引入@valid依赖了、因为他存在于Web开发包中的最核心之中

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.0.5.RELEASE</version>
</dependency>

如果不是SpringBoot项目,要在Maven的Pom中显式引入@valid依赖

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

校验实体类大部分人使用的方法肯定都是controller层里面拿出来判断是否为空,其实可以直接通过实体类中的注释@NotNull直接校验,如图

但经过我的实验,不知道什么原因,在我的项目中并没有起到作用,解决如下

1、更换方法入参类型

在网上看到@Valid是可以用在方法、构造函数、方法参数和成员属性(字段)上,而我一开始controller层中使用的是json接收的,转换成实体类后再校验的,如图

修改如下:在controller接收数据时直接以对象接收,在入口中直接以注解进行校验

2、错误内容过多

此时对象字段校验生效,但是出错时返回的是很凌乱的内容,如图:

3、使用对象接收错误内容,按自己要求输出

上面的图片可看出,返回内容中defaultMessage就是想要输出的内容,所以在方法中添加一个接收错误信息的类型为BindingResult的对象,如果对象有数据,则输出错误数据,如图:

另一层面的实现了实体类的参数校验,大家如果有更好的方法可以留言交流

springboot 校验机制 @Validated @Valid

1、探究原因

在开发的过程中一直迷惑 @Validated 与 @Valid 的用法,有时候是@Validated ,有时候是@Valid 。虽然能够实现校验,但是还是不够明确何时能够生效,不了解他生效的情况

首先定位2个注解所属的包:

@Validated 在 spring-context 包下属于spring 提供的核心包

@Valid 在 validation-api 包下 2.0.2 版本

@Validated 是spring 核心包,是每个项目都有的,那么 api 是如何引入的? 查看maven 依赖

原来是在引入 Spring-boot-start-web 的时候,就引入了该依赖

两个注解存在不同的包,而@NotNull ,@Null ,@Size ,@Max 等校验注解是哪里的呢?

这些注解都是在 api 包下

2、使用@Validated 实现校验机制

情景一: 查询参数是一个实体,Get 请求,在不添加任何注解的情况下,查询是正常的,实体参数字段都为null

现在需求 id 字段不能为空,在实体id 字段标记 @NotNull ,继续查询,发现注解没有生效

经过测试,只有请求实体参数列表前加@Validated 才会生效,即使@Validated 加在类上也无法生效

情景二: 查询参数是基本或者引用类型字段,参数列表中加入 @NutNull 修改该字段。发现无法生效

经过测试:只有全局类上加@Validated 才会生效,即使参数列表中加入 @Validated 也无法生效

产生异常也有所不同:在校验生效的情况下,实体类校验产生的异常是:BindException , 而参数列表产生的异常是:ConstraintViolationException

3、使用@Valid 实现校验机制

场景一:与上述一致,只有@Valid 作用在参数列表前才会生效

场景二:@Valida 不管是左右在参数列表还是类上,都无法生效。只能使用@Validated 全局设置

结论:暂不清楚@Valid 设计出现的原因,所以的校验@Validate 均可以实现

附加全局异常捕获:

@RestControllerAdvice
public class GlobalException {
    @ExceptionHandler({BindException.class})
    public RespResult validationException(BindException exception){
        List<ObjectError> errors =  exception.getAllErrors();
        if(!CollectionUtils.isEmpty(errors)){
            StringBuilder sb = new StringBuilder();
            errors.forEach(e->sb.append(e.getDefaultMessage()).append(","));
            return new RespResult(400, sb.toString());
        }
        return new RespResult(500, exception.getLocalizedMessage());
    }
    @ExceptionHandler({ConstraintViolationException.class})
    public RespResult constraintViolationException(ConstraintViolationException exception){
        Set<ConstraintViolation<?>> constraintViolations = exception.getConstraintViolations();
        if(!CollectionUtils.isEmpty(constraintViolations)){
            StringBuilder sb = new StringBuilder();
            constraintViolations.forEach(e->sb.append(e.getMessage()).append(","));
            return new RespResult(400, sb.toString());
        }
        return new RespResult(500, exception.getLocalizedMessage());
    }
}

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

(0)

相关推荐

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

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

  • springboot @Valid注解对嵌套类型的校验功能

    @Valid注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在API接收数据时添加@valid关键字,这时你的实体将会开启一个校验的功能,具体的代码如下,是最基本的应用: 实体: public class DepartmentDto { @ApiModelProperty("id") private String id; @ApiModelProperty("上级Id") private String parentId; @ApiModelPr

  • Spring Boot 数据校验@Valid+统一异常处理的实现

    1.先在你需要校验的实体类上面加上所需要的注解 为了测试,我自己就简单写了.@NotNull 和 @NotBlank 不能为空 @Entity @Table(name = "User") @Data public class User implements Serializable { @Id @NotNull(message = "id不能为空") @GeneratedValue(strategy = GenerationType.IDENTITY) privat

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

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

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

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

  • Lombok的@Data等注解无效的解决

    一.已定义好的实体类 二.调用时没有get,set访问器 在用@Data注解时,没有生成setter/getter方法.百度了一堆都没解决方法,后来用Google查了一下解决了~~~ 使用IDEA需要安装Lombok插件,我这里已经下载好,如果没下载安装点击install进行下载安装即可~~~ 到此这篇关于Lombok的@Data等注解无效的解决的文章就介绍到这了,更多相关Lombok的@Data注解无效内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

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

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

  • 参数校验Spring的@Valid注解用法解析

    参数校验Spring的@Valid注解 @Valid 注解通常用于对象属性字段的规则检测. 以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出 @Valid 注解用法详解. 那么,首先,我们会有一个员工对象 Employee,如下 : public class Employee { /** 姓名 */ public String name; /** 年龄 */ public Integer age; public String getName() { return name; } publ

  • Springboot hibernate-validator 6.x快速校验示例代码

    目录 一.版本信息及maven依赖 二.定义实体bean 三.测试Controller 四.hibernate-validator全局异常处理 五.hibernate-validator快速校验 一.版本信息及maven依赖 hibernate-validator 7.x版本有问题,暂时以6.2.1.Final为例,6.2.1.Final版本解决了Log4j版本的漏洞 <properties> <!-- JDK版本 --> <java.version>1.8</j

  • 解决@Validated注解无效,嵌套对象属性的@NotBlank无效问题

    目录 @Validated注解无效,嵌套对象属性的@NotBlank无效 步骤 内层对象无法验证 @Validated注解不生效问题.如何使用 1.需要引入的包 2.将@Validated打在controller中需要验证的实体类前面 3.在具体实体类中定义字段的验证规则 4.数据格式校验 在controller中的方法中进行单个参数校验注意事项 @Validated注解无效,嵌套对象属性的@NotBlank无效 最近在做的公司项目是一个表单系统,刚好要用到@Validated注解来对表单字段进

  • javax NotBlank和Email注解失效的解决

    javax NotBlank和Email注解失效 使用javax的NotBlan和Email注解, 结果报类似错误 no validator could be found for constraint 'javax.validation.constraints.notblank' 原来是由于javax只提供了注解的定义,未提供对应的处理器,一般使用hibernate提供的注解处理器. 但是hibernate未提供NotBlank和Email注解的处理器(但是hibernate自己定义的NotBl

  • 解决springboot中@DynamicUpdate注解无效的问题

    springboot 中 @DynamicUpdate 注解无效解决方案 遇到的问题 项目中使用 jpa,以前没用过,所以踩坑在所难免. 在使用过程中,要更新一条记录的某个字段,更新成功以后,发现整条记录只剩下我更新的那个字段,其他的全部为空了. 瞬间明白,这种更新是全覆盖,针对每个字段 update,实体类没赋值的字段,也直接将空值 set 过去了. 寻求解决方案 正在庆幸这么容易就解决,突然发现并没有这么简单. 群众的力量是无穷大的,我立刻就明白这个注解为什么无效,原来是搞错了它的用途. 一

  • spring-data-elasticsearch @Field注解无效的完美解决方案

    前言 我看了一大堆博客和资料大多是说这个spring的bug, 然后通过一个.json的配置文件去加载,我也是真的笑了, 本来注解就是方便开发,取消配置文件的功能, 结果解决方案却是本末倒置, 这里我奉献出最正确的解决方案 一. 准备实例代码 这是实体类代码,及其注解 package com.gupao.springbootdemo.bean; import lombok.Data; import org.springframework.data.annotation.Id; import or

  • 关于Spring注解@Async引发其他注解失效的解决

    概述 在前面一篇文章中,介绍,在一个Bean中注入自己,如果有@Async和@Transaction,如果使用@Autowire注入自身,会报循环依赖,如果使用BeanFactoryAware注入自己,会使得@Transaction失效. 例如: @Service public class MyService implements BeanFactoryAware{ private MyService self; //事务注解无效 @Transactional public void notWo

随机推荐