Spring @Valid @Validated

对于属性的验证有如下一些注解
@NotBlank:只用在String上,值不能为null,并且trim后长度大于零。不为null,不是全为空格的字符串
@NotNull: 不能为null,但可以是长度为零的字符串
@NotEmpty: 不能为null,长度大于零
@Null:必须为null
@Min(value): 数字,值必须大于等于指定的值
@Max(value): 数字,值必须小雨等于指定的值
@DecimalMin(value): 数字,值必须大于等于指定的值
@DecimalMax(value): 数字,值必须小雨等于指定的值
@Digits(integer, fraction):数字,值必须在可接收的范围内@Digits(integer=3, fraction=2) 111.22是符合要求的,1111.22不符合,整数部分4位所以不符合要求
@Size(min=v1,max=v2): v1<=值<=v2
@AssertTrue: 必须为true
@AssertFalse: 必须为false
@Past: 必须是过去的日期
@Future: 必须是将来的日期
@Pattern(regex=, flag=): 符合指定的正则表达式

@Valid:可以用在方法参数,方法,属性上。用来进行嵌套验证。嵌套验证就是在ClassA的属性中有ClassB,而ClassB的属性也需要进行验证。

@Validated:可以用在方法参数,方法上,不能用在属性上。提供了分组的功能,在参数传入时根据分组采用不同的验证机制。说明一下分组,例如对于User的userID,在新建用户时userID必须要为null。在更新用户时userID必须要不为空并且不能都是空格(blank)。这就对userID进行了分组功能,Add和Update两个组。

@Valid实例

Book定义

public class Book {

    @NotBlank(message = "bookID is mandatory, can not be blank")
    public String bookID;
    
    @Size(min=5, max=20)
    @NotBlank(message = "bookName is mandatory, can not be blank")
    public String bookName;
    public String author;
    
    @Valid
    public List<ChapterInfo> chapterList;
    
    public Book(String id, String name, String auth) {
        bookName = name;
        author = auth;
        bookID = id;
    }
}

ChapterInfo定义

public class ChapterInfo {
    @Min(0)
    public Long chapterID;
    
    @NotBlank
    @Size(min=5, max=50)
    public String chapterName;
    
    @Size(min=5, max=20)
    public String contentID;
}

BookController

@RestController
@RequestMapping("/bookcontroller")
public class BookController {

    private List<Book> bookList = new ArrayList();
    
    @ResponseBody
    @RequestMapping("/addBookToList")
    public boolean addBookToList(@Valid @RequestBody Book b) {
        System.out.println(b.bookName);
        
        bookList.add(b);
        
        return true;
    }
    
    @InitBinder
    private void activateDirectFieldAccess(DataBinder dataBinder) {
        dataBinder.initDirectFieldAccess();
    }
    
}

Postman验证
屏幕快照 2020-01-07 下午5.19.16.png
可以看到chapterList中的ChapterInfo的chapterName为blank,验证不通过

@Validated实例
public class User {
    
    @NotBlank
    public String name;
    
    @NotBlank
    public String address;
    
    @Min(1)
    public int age;

    public boolean isMan;
    
    @NotBlank(groups = {Update.class})
    @Null(groups = {Add.class})
    public String usrID;
    
    public interface Add{}
    
    public interface Update{}
    
    
    public User(String name, String addr, int age, boolean isMan) {
        this.name = name;
        this.address = addr;
        this.age = age;
        this.isMan = isMan;
    }

}

其中对usrID属性使用了@NotBlank(groups = {Update.class})和@Null(groups = {Add.class})注释。意思是:
(1)Update user时usrID不能为blank(要通过usrID查找user去update)
(2)Add user时usrID必须为空(要生成新的user,会分配user ID)

@RestController
@RequestMapping("/registcontroller")
public class RegistController {

    List<User> usrList = new ArrayList();
    
    
    @PostMapping(path="/adduser")
    @ResponseBody
    public User addUser(@RequestBody @Validated({User.Add.class}) User usr, BindingResult result) {
        
        if (result.hasErrors()) {
            List<ObjectError> list = result.getAllErrors();
            FieldError error = (FieldError)list.get(0);
            System.out.println(error.getObjectName() + "," + error.getField() + "," + error.getDefaultMessage());
            return null;
        }
        User user = new User(usr.name, usr.address, usr.age, usr.isMan);
        String usrID  = usrList.size() + "";
        
        user.usrID = usrID;
        
        return user;
    }
}

在addUser的传入参数进行了Validated的分组验证(Add),如果传入User的usrID不为blank则会出错。

PostMan验证
usrID不存在时
屏幕快照 2020-01-07 下午4.18.25.png
正常返回新添加的user

指定usrID时
屏幕快照 2020-01-07 下午4.19.17.png
屏幕快照 2020-01-07 下午4.19.36.png
出错

Image placeholder
pi_dan
未设置
  40人点赞

没有讨论,发表一下自己的看法吧

推荐文章
Spring-SpringAOP原理,手写Spring事务框架

一、Spring核心知识Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由RodJohnson在其著作ExpertOne-On-OneJ2EEDevelopm

再见 Spring Boot 1.X ,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring官方在其博客宣布,SpringBoot1.x停止维护,SpringBoot1.x生命周期正式结束。其实早在2018年7月30号,Spring官方就已经在博客进行过预告,

面试问烂的 Spring AOP 原理、SpringMVC 过程

  正文  SpringAOP,SpringMVC,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以。但今天笔者带大家一起深入浅出源码,看看他的原理。以期让印象更加深刻,面试的时候游刃有余。

BAT大牛推荐开发人员必备Spring源码剖析文档,深度剖析Spring

为什么学习读源码我们每天都和代码打交道。经过数年的基础教育和职业培训,大部分程序员都会「写」代码,或者至少会抄代码和改代码。但是,会读代码的并不在多数,会读代码又真正读懂一些大项目的源码的,少之又少。

基于Redis实现Spring Cloud Gateway的动态管理

引言:SpringCloudGateway是当前使用非常广泛的一种API网关。它本身能力并不能完全满足企业对网关的期望,人们希望它可以提供更多的服务治理能力。但SpringCloudGateway并不

Spring Boot到底是怎么运行的,你知道吗?

导读SpringBoot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较流行的微服务框架SpringCl

Spring Boot 面试,一个问题就干趴下了!

随着SpringBoot使用越来越广泛,SpringBoot已经成为Java程序员面试的知识点,很多同学对SpringBoot理解不是那么深刻,经常就会被几个连环跑给干趴下了!比如下面这一段的Spri

Spring入门这一篇就够了

前言前面已经学习了Struts2和Hibernate框架了。接下来学习的是Spring框架…本博文主要是引入Spring框架…Spring介绍Spring诞生:创建Spring的目的就是用来替代更加重

Spring Cloud 上手实战-架构解析及实作

Spring简介为什么要使用微服务单体应用:目前为止绝大部分的web应用软件采用单体应用,所有的应用的用户UI、业务逻辑、数据库访问都打包在一个应用程序上。缺点:开发相互干扰,随着应用的不断升级沟通协

SpringBoot 深度调优,让你的项目飞起来!

项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情。在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行。一、修改配置文件关于修改配置文件application.p

使用 Docker 部署 Spring Boot 项目

Docker技术发展为微服务落地提供了更加便利的环境,使用Docker部署SpringBoot其实非常简单,这篇文章我们就来简单学习下。首先构建一个简单的SpringBoot项目,然后给项目添加Doc

Spring Boot 中关于自定义异常处理的套路!

在SpringBoot项目中,异常统一处理,可以使用Spring中@ControllerAdvice来统一处理,也可以自己来定义异常处理方案。SpringBoot中,对异常的处理有一些默认的策略,我们

Github 上 Star 最多的 Spring Boot 个人开源学习项目

2016年,在一次技术调研的过程中认识到了SpringBoot,试用之后便一发不可收拾的爱上它。为了防止学习之后忘记,就在网上连载了 SpringBoot系列文章,没想到这一开始便与SpringBoo

Spring Boot 中的响应式编程和 WebFlux 入门

Spring5.0中发布了重量级组件Webflux,拉起了响应式编程的规模使用序幕。WebFlux使用的场景是异步非阻塞的,使用Webflux作为系统解决方案,在大多数场景下可以提高系统吞吐量。Spr

0103-springmvc的基本流程

背景现在的it研发,已经从管理系统时代迈入了互联网系统时代。页面开发已经从基于JSP+struts转变为为前后端分离的方式(springMVC+JS);思想MVCmvc框架不仅适用于java的开发,也

SpringBoot整合RabbitMQ

SpringBoot整合RabbitMQSpringBoot框架已经提供了RabbitMQ的使用jar包,开发人员在使用RabbitMQ的时候只需要引用jar包简单的配置一下就可以使用RabbitMQ

SpringMVC加载流程

 这节介绍SpringMVC,SpringMVC是一种基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架。本章会介绍相关概念,流程,再从源码进行讲解。1.MVC MVC(ModelVie

稳定性专题 | Spring Boot 常见错误及解决方法

导读『StabilityGuide』是阿里多位阿里技术工程师共同发起的稳定性领域的知识库开源项目,涵盖性能压测、故障演练、JVM、应用容器、服务框架、流量调度、监控、诊断等多个技术领域,以更结构化的方

SpringBoot连接多RabbitMQ源

在实际开发中,很多场景需要异步处理,这时就需要用到RabbitMQ,而且随着场景的增多程序可能需要连接多个RabbitMQ。SpringBoot本身提供了默认的配置可以快速配置连接RabbitMQ,但

Spring Cloud Alibaba 教程 | Nacos(四)

Nacos环境隔离Nacos管理台有一个单独的菜单“命名空间”,里面默认存在一个名为“public”的默认命名空间,我们在使用Nacos时不管是作为注册中心还是配置中心,都是作用在该命名空间之下的,那

0107 spring操作数据库的3个架子

背景数据库开发是java的核心内容之一,基础就是jdbc了;然而直接使用jdbc,需要写大量的try-catch-finally模板代码;管理系统使用hibernate作为orm框架比较方便,遵循jp

Spring Cloud Alibaba 教程 | Nacos(五)

扩展配置(extendedconfigurations)通过之前的学习,我们知道应用引入nacos配置中心之后默认将会加载DataID=${prefix}-${spring.profiles.acti

使用Jenkins一键打包部署SpringBoot应用,就是这么6!

SpringBoot实战电商项目mall(25k+star)地址:https://github.com/macrozheng/mall 摘要任何简单操作的背后,都有一套相当复杂的机制。本文将以Spri

Spring第四天

Spring第四天

IBM Spectrum Protect 8.1.7在AIX7.1上的安装和配置

                                                本文作者: 谷铁柏摘要:    本文章主要讲述IBMSpectrumProtect8.1.7版本在AIX