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

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

@Validated注解无效,嵌套对象属性的@NotBlank无效

最近在做的公司项目是一个表单系统,刚好要用到@Validated注解来对表单字段进行验证。第一次使用遇到了一些坑,问了同事之后,总算是掌握了。

步骤

首先,在dto实体你想要做验证的属性前,加上@NotBlank/NotNull/NotEmpty注解:

他们的区别如下:

  • @NotBlank:只用在String上,表示传进来的值不能为null,而且调用trim()后,长度必须大于0
  • @NotNull:不能为null,但可以为empty(分配了内存空间,但值为空)
  • @NotEmpty:不能为null,而且长度必须大于0

然后在service层接口前添加注解@Validated

然后运行,给属性传递空值,发现没有任何反应;是因为没在接口方法的参数前加上@Valid注解,如下所示:

加上后再运行,传递空值,成功报错。 (同时,以上总结可以加在controller层进行验证,@valid同样加在方法参数前,@validated加在controller类名前图

同样能起效果)

内层对象无法验证

做到后面发现传递的对象里面还有一个对象,要对里面的对象进行验证,这时候是验证不到的

需要在里面对象前也加上总结@valid,这样,无论嵌套多少,都可以验证

(对于对象泛型,也能验证成功)

@Validated注解不生效问题、如何使用

1、需要引入的包

(缺少其中一个包,项目会报错,或者validate注解不生效)

  • hibernate-validator-6.0.14.Final.jar
  • jboss-logging-3.3.2.Final.jar
  • validation-api-2.0.1.Final.jar
  • classmate-1.4.0.jar

2、将@Validated打在controller中需要验证的实体类前面

@PostMapping("/add")
@ResponseBody
public AjaxResult addSave(@Validated SysDept dept){
}

3、在具体实体类中定义字段的验证规则

(这里注解可以放在字段上,或者是get方法上,放在set方法上,会报错)

private String deptName;
@NotBlank(message = "部门名称不能为空")
@Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
public String getDeptName(){
    return deptName;
}

4、数据格式校验

对其错误进行处理(全局异常处理),不进行处理,会直接报400错误

@ControllerAdvice

可以实现三个方面的功能:

  • 全局异常处理
  • 全局数据绑定
  • 全局数据预处理
@RestControllerAdvice
public class GlobalExceptionHandler{
    @ExceptionHandler(BindException.class)
    public ApiResult validatedBindException(BindException e){
        log.error(e.getMessage(), e);
        String message = e.getAllErrors().get(0).getDefaultMessage();
        return ApiResult .error(message);
    }
}

在controller中的方法中进行单个参数校验注意事项

1、controller类上打上注解@Validated

2、方法参数上给出格式如:

public Result method(@NotNull @RequestParam("id") Long id) {

3、其中@RequestParam("id")必须加,否则验证无效

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

(0)

相关推荐

  • Java使用@Validated注解进行参数验证的方法

    目前项目中大部分代码进行参数验证都是写代码进行验证,为了提升方便性和代码的简洁性,所以整理了下使用注解进行参数验证.使用效果如下: // 要验证的实体类 @Data public class User implements Serializable { @NotBlank(message = "id不能为空!",groups = Update.class) protected String id = ""; @NotBlank(message = "商户i

  • 解决get请求入参@NotNull验证不生效问题

    目录 get请求@NotNull验证不生效 解决办法 使用@NotEmpty,@NotBlank,@NotNull及@Valid注解校验请求参数 这里列举一下常用的注解 当校验不同过时,会返回对应的message描述 CreateUserRequest 实体类并添加校验注解 get请求@NotNull验证不生效 解决办法 在该方法的controller类上加@Validated 验证信息生效了 使用@NotEmpty,@NotBlank,@NotNull及@Valid注解校验请求参数 @NotE

  • 一次踩坑记录 @valid注解不生效 排查过程

    一.背景 在进行一次Controller层单测时,方法参数违反Validation约束,发现却没有抛出预期的[违反约束]异常. 方法参数上的@Valid注解不生效?? 但是以Tomcatweb容器方式启动,请求该API,@Valid注解却生效了,甚是怪异. 代码如下: @RestController @RequestMapping("/api/user/") public class UserController @RequestMapping(value = ""

  • 如何解决@NotBlank不生效的问题

    解决@NotBlank不生效 在项目开发中,发现一个类中包含有另外一个类,这种包含关系的类上的@NotBlank校验不生效,后来发现需要在内部的类的域上加上@Valid注解,如下: /** * 标签体系ID */ @NotBlank(message = "00000002") @Length(max = 20, message = "00000005") private String systemId; /** * 条件模板id */ private String

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

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

  • 解决vue数组中对象属性变化页面不渲染问题

    做checkbox多选功能的时候遇到了一个坑,逻辑怎么看都对,但是就是有bug,最后发现数组那里值变了页面勾选没有重新渲染. 换了关键词搜索找到了相关方法. 其实之前读文档教程的时候看到过这里,但是只有真的使用之后才会有最直接的感触. 数组更新检测 变异方法 Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新.这些方法如下: push() pop() shift() unshift() splice() sort() reverse() 你打开控制台,然后用前面例子的 items 数

  • 基于@RequestBody注解只能注入对象和map的解决

    目录 @RequestBody注解只能注入对象和map的问题 1.自定义一个适应于这种情况的注解@RequestJson 2.自定义RequestJsonHandlerMethodArgumentResolver 3.将上述配置应用到spring项目中 4.配置完成了,简单使用 @RequestBody注解的使用问题 先看一下@RequestBody的作用 个人总结: @RequestBody注解只能注入对象和map的问题 前后端分离开发模式下,前后端数据交互全部采用json,所以在后端在采用s

  • 解决Mybatis中foreach嵌套使用if标签对象取值的问题

    目录 foreach嵌套使用if标签对象取值问题 大体格式 解决办法 代码如下 Mybatis if 语句嵌套 要求 foreach嵌套使用if标签对象取值问题 最近做项目过程中,涉及到需要在 Mybatis 中 使用 foreach 进行循环读取传入的查询条件,动态拼接SQL语句,接口传入的查询条件格式:{"advanceSearchList":[{"searchType":10,"searchText":"12"}]} ,

  • 解决vue中对象属性改变视图不更新的问题

    常规情况下我们在vue实例的data中设置响应数据.但当数据为对象,我们增加或删除对象属性值时,视图并不触发更新,如何解决这个问题呢? 实例代码如下: let vm = new Vue{ el: '#app', data: { obj: { k: 'v' } }, ... } 有三种解决方案: 方案一:利用Vue.set(object,key,val) 例:Vue.set(vm.obj,'k1','v1') 方案二:利用this.$set(this.obj,key,val) 例:this.$se

  • 解决vue select当前value没有更新到vue对象属性的问题

    vue是一款轻量级的mvvm框架,追随了面向对象思想,使得实际操作变得方便,但是如果使用不当,将会面临着到处踩坑的危险,写这篇文章的目的是我遇到的这个问题在网上查了半天也没有发现解决方案,最终研究了vue的源码中有关select元素的部分找到了答案,下面简单介绍我踩的关于select的一个坑: 使用场景:有两个select元素,一个select元素变动时,动态修改另一个select中填充的内容,并默认选择第一项,问题来了,每次当我提交form数据时发现:从slave元素对应的数据没有更新到响应v

  • 解决Vue2.0 watch对象属性变化监听不到的问题

    问题 很早之前就遇到一个问题,父组件向子组件传值,子组件监听传入对象的某个属性.发现子组件使用deep watch都不能观察到对象中属性的变化,今天终于找到为啥出现这种问题和解决办法了. 解决 为啥出现这种问题?受 ES5 的限制,Vue.js 不能检测到对象属性的添加或删除. 请参照https://v1-cn.vuejs.org/guide/reactivity.html 解决方式: 通过vue的this.$set(object, key, value)方法 通过Object.assign()

  • 解决vue无法侦听数组及对象属性的变化问题

    一.数组 1.可以监听到的情况 如push.splice.=赋值(array=[1,2,3]) 2.无法监听到的情况 使用下标修改某个元素(这种比较常见) array[index] = 1 object.a = 3 直接修改数组length array.length = 5 3.解决方案 this.$set(array, index, data) - 这是个深度的修改,某些情况下可能导致你不希望的结果,因此最好还是慎用 this.dataArr = this.originArr this.$se

  • 解决@Value注解不能注入static修饰的属性问题

    目录 @Value注解不能注入static属性 问题描述 剖析 @Value(“${属性}“)注入被static修饰的属性 问题描述 解决方案 @Value注解不能注入static属性 问题描述 在application.yml中: constant:   key: hello   value: world 工具类ConstantHelper: @Component public class ConstantHelper {     @Value("${constant.value}"

  • 详解Spring中@Valid和@Validated注解用法

    目录 案例引入 @Valid 详解 @Validated 详解 @Valid 和 @Validated 比较 案例引入 下面我们以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出 @Valid 和 @Validated 注解用法详解. 那么,首先,我们会有一个员工对象 Employee,如下 : /** * 员工对象 * * @author sunnyzyq * @since 2019/12/13 */ public class Employee { /** 姓名 */ public St

随机推荐