Spring boot @Validated注解以及配合@Valid的使用

https://blog.csdn.net/MR_L_0927/article/details/84784482

简单的方法是 直接在Controller内的接口参数前加上校验注解(@NotBlank...等),此时需在类上加注解  @Validated即可.当校验参数过多,这种方法使接口参数看起来过于臃肿,代替的选择是使用 @Validated 注解来进行一些参数的验证.

第一步 Bean实体类加注解
下面是验证注解的类型

@Null 只能为null
@NotNull 必须不为null
@Max(value) 必须为一个不大于 value 的数字
@Min(value)  必须为一个不小于 value 的数字
@AssertFalse 必须为false
@AssertTrue 必须为true
@DecimalMax(value) 必须为一个小于等于 value 的数字
@DecimalMin(value) 必须为一个大于等于 value 的数字
@Digits(integer,fraction) 必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Past  必须是 日期 ,且小于当前日期
@Future 必须是 日期 ,且为将来的日期
@Size(max,min) 字符长度必须在min到max之间
@Pattern(regex=,flag=) 必须符合指定的正则表达式
@NotEmpty 必须不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank  必须不为空(不为null、去除首位空格后长度不为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 
必须为Email,也可以通过正则表达式和flag指定自定义的email格式

public class User {

@NotEmpty(message = "姓名不能为空")
private String username;

@Size(min=6 ,max= 20 ,message = "密码长度应在6--20位之间")
private String password;
}

?
第二步 Controller层编写
在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResult br接收校验出错信息

@RestController
@RequestMapping(value = "user")
public class UserController {

@GetMapping(value = "msg")
public String User(@Validated User user, BindingResult br) {
if(br.hasErrors()) {
return "error";
}
return "success";
}

}
需要注意的是, BindingResult br 一定要跟在 @Validated 注解对象的后面,且当有多个@Validated
注解时,每个注解对象后面都需要添加一个 BindingResult br.即
(@Validated User user, BindingResult brOfUser,
@Validated Goods goods, BindingResult brOfGoods)

判断是否有误时也需要分别判断, brOfUser.hasErrors,brOfGoods.hasErrors
而且 BindingResult 只能跟在 实体类 后面.否则会报
java.lang.IllegalStateException: An Errors/BindingResult argument is expected to be declared immediately after the model attribute, the @RequestBody or the @RequestPart arguments to which they apply: public void com.yoona.TestAnnotation.myTest(java.lang.String,org.springframework.validation.BindingResult)

@Validated还提供分组验证功能

第一步 创建分组接口
public interface groupOne{
}

public interface groupTwo{
}

第二步 Bean实体类中添加分组
public class User {

@NotEmpty(groups={groupOne.class},message = "姓名不能为空")
private String username;

@Size(groups={groupTwo.class},min=6 ,max= 20 ,message = "密码长度应在6--20位之间")
private String password;
}
第三步 Controller中参数添加接口
@RestController
@RequestMapping(value = "user")
public class UserController {

@GetMapping(value = "msg")
public String User(@Validated({groupOne.class}) User user, BindingResult br) {
if(br.hasErrors()) {
return "error";
}
return "success";
}
}
这样就只验证 User 类中的 属性为 groupOne 组内的属性,而 属于 groupTwo 组内的属性不需验证.

默认情况下,分组验证时无序的,但是有些情况下,验证顺序很重要(如第一个验证不通过,后面的验证就不需要),可以使用@GroupSequence 注解进行排序

/*
* 分组顺序接口类
*/
import javax.validation.GroupSequence;

//分组序列先Frist再Second
@GroupSequence({First.class,Second.class})
public interface Group{
}

Controller层
@RestController
@RequestMapping(value = "user")
public class UserController {

@GetMapping(value = "msg")
public String User(@Validated({Group.class}) User user, BindingResult br) {
if(br.hasErrors()) {
return "error";
}
return "success";
}
在含有嵌套验证的时候,需要 @Validated 与 @Valid 配合使用,需要注意的是,在检验Controller的入参是否符合规范时,使用@Validated或者@Valid在基本验证功能上没有太多区别.但是 @Valid 暂不支持分组功能[email protected]不能用于成员属性上,@Valid可以.

public class User {
@NotNull
private String name;
@NotNull
private List<Persion> persions;
}

public class Persion {
@NotBlank(message = "性别不能为空")
private String gender;
}
此时在 Controller 中,

@RestController
@RequestMapping(value = "user")
public class UserController {

@GetMapping(value = "msg")
public String User(@Validated User user, BindingResult br) {
if(br.hasErrors()) {
return "error";
}
return "success";
}
}

?
@Validates 加在 User 前,只会对 User 的属性验证,而嵌套的 Persion 内的属性不会验证.如果想要全部验证,则只需要在实体类中

public class User {
@NotNull
private String name;
@Valid //此处加该注解,就可以嵌套验证
@NotNull
private List<Persion> persions;
}

public class Persion {
@NotBlank(message = "性别不能为空")
private String gender;
}
参数数量比较少时,可以直接使用需要的校验注解,不需使用@Validates或@Valid.

public volid func(@NotNull @Length(min = 6, max = 6, message = "请求参数有误") String str, HttpServletRequest rq, HttpServletResponse rp){
// .....................
}
 
————————————————
原文链接:https://blog.csdn.net/MR_L_0927/article/details/84784482

原文地址:https://www.cnblogs.com/kelelipeng/p/12603370.html

时间: 2024-10-23 17:27:38

Spring boot @Validated注解以及配合@Valid的使用的相关文章

用spring的@Validated注解和org.hibernate.validator.constraints.*的一些注解在后台完成数据校验

这个demo主要是让spring的@Validated注解和hibernate支持JSR数据校验的一些注解结合起来,完成数据校验.这个demo用的是springboot. 首先domain对象Foo的代码如下: package com.entity; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.NotBlank; import javax.validati

spring boot 之注解

@EnableAutoConfiguration有这个注解,spring boot 就会根据classpat中的jar依赖,来猜测你将要开发一个什么样的spring应用.比如:spring-boot-starter-web这个依赖,则springboot就会自动嵌入tomcat和springMVC的相关依赖,并在启动的时候,启动为一个web应用.并会查找相应的配置参数,如果没有,则使用默认值.如:server.port=8080: @Component它是一个类级注解.当应用是通过注解来配置或x

spring boot 的注解

(1)@SpringBootApplication 申明让spring boot自动给程序进行必要的配置,这个配置等同于: @Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三个配置. 示例代码: package com.kfit; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.Spr

spring boot常用注解使用小结

1.@RestController和@RequestMapping注解 4.0重要的一个新的改进是@RestController注解,它继承自@Controller注解. 4.0之前的版本,Spring MVC的组件都使用@Controller来标识当前类是一个控制器servlet.使用这个特性,我们可以开发REST服务的时候不需要使用@Controller,而专门的@RestController. 当你实现一个RESTful web services的时候,response将一直通过respo

Spring Boot MyBatis注解:@MapperScan和@Mapper

最近参与公司的新项目架构搭建,在使用mybatis的注解时,和同时有了不同意见,同事认为使用@Mapper注解简单明了,而我建议使用@MapperScan,直接将mapper所在的目录扫描进去就行,而且@Mapper需要在每一个mapper上都添加,繁琐.同事又说--我们可以用逆向工程自动生产entity,mapper,service时,将注解加上,很方便的,于是各执一词. 下面是我整理的这两种方法的比较: 使用@Mapper注解 为了让DemoMapper能够让别的类进行引用,我们可以在Dem

Spring Boot Annotations 注解

1.概述 Spring Boot通过其自动配置功能使Spring更容易配置. 在本教程中,我们将探讨org.springframework.boot.autoconfigure和org.springframework.boot.autoconfigure.condition包中的注释. 2. @SpringBootApplication 我们使用此批注来标记Spring Boot应用程序的主类: @SpringBootApplication封装@Configuration,@EnableAuto

Spring Boot @Condition 注解,组合条件你知道吗

上一篇文章 你应该知道的 @ConfigurationProperties 注解的使用姿势,这一篇就够了 介绍了如何通过 @ConfigurationProperties 注解灵活读取配置属性,这篇文章将介绍如何灵活配置 Spring Bean 写在前面 当我们构建一个 Spring 应用的时候,有时我们想在满足指定条件的时候才将某个 bean 加载到应用上下文中, 在Spring 4.0 时代,我们可以通过 @Conditional 注解来实现这类操作 我们看到 @Conditional 注解

【转】Spring Boot @Condition 注解,组合条件你知道吗

原文:https://www.cnblogs.com/FraserYu/p/11280420.html 上一篇文章 你应该知道的 @ConfigurationProperties 注解的使用姿势,这一篇就够了 介绍了如何通过 @ConfigurationProperties 注解灵活读取配置属性,这篇文章将介绍如何灵活配置 Spring Bean 写在前面 当我们构建一个 Spring 应用的时候,有时我们想在满足指定条件的时候才将某个 bean 加载到应用上下文中, 在Spring 4.0 时

Spring Boot 之注解@Component @ConfigurationProperties(prefix = &quot;sms&quot;)

从spring-boot开始,已经支持yml文件形式的配置,@ConfigurationProperties的大致作用就是通过它可以把properties或者yml配置直接转成对象 例如: 配置文件: sms.url=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX sms.appkey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX sms.secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX sms.signName=XXXXXXXXXXXXX