SpringBoot#JSR303
__震惊了!,一遍一遍在业务逻辑中编写的验证条件被抽离了!
是什么:
-
Java Specification Requests 303 ,用于对javaBean 属性的验证。
-
解决了什么问题:
-
1. 业务中充斥着对javabean属性的验证,这些都是很必要的验证,不能缺少,但是又让代码变得不那么可读,也不方便代码的维护,使用jsr303的相关技术,
就把对bean的验证抽取了出来,是业务代码更清晰。
-
要点:
-
1. 使用Bean Validation 的参考实现,如果使用jpa,那么就已经有了;
2. 使用注解限制bean的属性;
3. 在控制器方法中使用Vaild注解,表示当前参数需要被验证;
4. 紧随Valid注解写上Errors参数,用于接收验证参数时候产生的错误;
5. 如果觉得默认的注解不够用,完全可以自定义自己的验证注解。
-
demo1 【基本使用】:
-
pojo:
_
- import javax.validation.constraints.NotEmpty;
- import javax.validation.constraints.Past;
- import java.util.Date;
- public class Person {
- @NotEmpty(message = "姓名不能为空")
- private String username;
- @Past(message = "生日只能是过去的日期")
- private Date birthday;
// 省略其他方法- }
_
controller:
_
- @RestController
- @RequestMapping("/t")
- public class TestController {
- @PostMapping
- public Object binderTest(@RequestBody @Valid Person p, Errors errors) throws Exception {
- if(errors.hasErrors()){
- throw new Exception(errors.getFieldErrors().toString());
- }else{
- // do something
- // do something
- return p;
- }
- }
- }
_
截图:
-
demo02:【自定义constraint】
-
1. 编写验证所需要的注解;
2. 实现javax.validation.ConstraintValidator接口,可以使用Autowired注解注入其他服务进来;
3.覆写boolean isValid(T value, ConstraintValidatorContext context);方法,完成校验的逻辑;
代码:
- ///////////////////////////////////////////////////////////////////////
- ///注解///////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////
- import javax.validation.Constraint;
- import javax.validation.Payload;
- import java.lang.annotation.*;
- @Constraint(validatedBy = {StatusValidator.class})
- @Documented
- @Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD})
- @Retention(RetentionPolicy.RUNTIME)
- public @interface Status {
- String message() default "不正确的状态 , 应该是 'created', 'paid', shipped', closed'其中之一";
- Class<?>[] groups() default {};
- Class<? extends Payload>[] payload() default {};
- }
- ///////////////////////////////////////////////////////////////////////
- ///验证器//////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////
- import javax.validation.ConstraintValidator;
- import javax.validation.ConstraintValidatorContext;
- import java.util.Arrays;
- public class StatusValidator implements ConstraintValidator<Status, String> {
- // 特别复杂的验证可能需要我们注入多个服务,也有可能一些验证需要查询数据库
- @Autowired
- private UserService userService;
- private final String[] ALL_STATUS = {"created", "paid", "shipped", "closed"};
- public void initialize(Status status) {
- }
- // 验证方法,此方法中可以调用注入的服务,可以对数据库进行查询~
- public boolean isValid(String value, ConstraintValidatorContext context) {
- User lhn = userService.findUserByUsername("lhn");
- System.out.println(lhn);
- if(Arrays.asList(ALL_STATUS).contains(value))
- return true;
- return false;
- }
- }
- ///////////////////////////////////////////////////////////////////////
- ///使用///////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////
- public class Person {
- @NotEmpty(message = "姓名不能为空")
- private String username;
- @Past(message = "生日只能是过去的日期")
- private Date birthday;
- @Status
- private String status;
- }
-
SpringBoot#JSR303的更多相关文章
- [SpringBoot] - 配置文件的多种形式及JSR303数据校验
Springboot配置文件: application.yml application.properties(自带) yml的格式写起来稍微舒服一点 在application.properties ...
- Springboot:JSR303数据校验(五)
@Validated //开启JSR303数据校验注解 校验规则如下: [一]空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @No ...
- SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(一): 搭建基本环境、整合 Swagger、MyBatisPlus、JSR303 以及国际化操作
相关 (1) 相关博文地址: SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(一):搭建基本环境:https://www.cnblogs.com/l-y- ...
- SpringBoot第七集:异常处理与整合JSR303校验(2020最新最易懂)
SpringBoot第七集:异常处理与整合JSR303校验(2020最新最易懂) 一.SpringBoot全局异常 先讲下什么是全局异常处理器? 全局异常处理器就是把整个系统的异常统一自动处理,程序员 ...
- 【全网最全】springboot整合JSR303参数校验与全局异常处理
一.前言 我们在日常开发中,避不开的就是参数校验,有人说前端不是会在表单中进行校验的吗?在后端中,我们可以直接不管前端怎么样判断过滤,我们后端都需要进行再次判断,为了安全.因为前端很容易拜托,当测试使 ...
- SpringBoot 使用 JSR303 自定义校验注解
JSR303 是 Java EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是hibernate Validator,有了它,我们可以在实体类的字段上标注不同的注解实现对数 ...
- 4 — springboot中的jsr303检验
1.导入依赖 <!--JSR303校验的依赖 --> <dependency> <groupId>org.springframework.boot</grou ...
- springboot配置(yami配置文件,JSR303数据校验,多环境配置)
yami配置文件 YAML是 "YAML Ain't a Markup Language" (YAML不是一种标记语言)的递归缩写.在开发的这种语言时,YAML 的意思其实是:&q ...
- SpringBoot 之 JSR303 数据校验
使用示例: @Component @ConfigurationProperties(prefix = "person") @Validated //使用数据校验注解 public ...
随机推荐
- 写给想要入门python或者正在入门python的小朋友们
写在前面: 最近好像python挺火,虽然我也在天天写python,但是python毕竟是动态语言,就拿常被人吐槽的java来说,python绝大不多数地方是不如java的.python只能是你的一个 ...
- PLSQL Developer常用设置及快捷键
CSDN日报20170314--<40岁程序员真的要被淘汰了么?> 程序员2月书讯 [直播]用面向协议的思想简化网络请求 博客一键搬家活动开始啦 PLSQL Developer常用设置及快 ...
- 数字对象NSNumber的使用
先简述下关于NSNumber的信息 NSNumber的存在就相当于java中的装箱与拆箱.只不过java中的装箱拆箱过程,使用的是对应的类型,比如基本数据类型是int.double类型,装箱时就得对应 ...
- Dubbo+zookeeper部署到tomcat上注意事项,遇到的问题,闪退,运行报错等
需要下载工具zookeeper-3.4.14.tar.gz,dubbo-2.5.x.zip,apache-tomcat-8.5.47-windows-x64.zip这些官网都可以先下载到 1.最新的z ...
- CentOS7 安装PHP7的swoole扩展:
一.绪 Swoole简介 PHP异步网络通信引擎 最终编译为so文件作为PHP的扩展 准备工作 Linux环境 PHP7 swoole2.1 redis 源码安装PHP7 源码安装swoole htt ...
- css 盒子模型简介
盒子模型 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...
- Day9 - A - Apple Catching POJ - 2385
Description 有两棵APP树,编号为1,2.每一秒,这两棵APP树中的其中一棵会掉一个APP.每一秒,你可以选择在当前APP树下接APP,或者迅速移动到另外一棵APP树下接APP(移动时间可 ...
- IOS TableView 用法
1.在视图上创建TableView( 拖控件),为ViewController创建UITableView属性(链接至TableView)和NSArray属性(存储数据) ViewController. ...
- IdentityServer4专题之二:OpenID介绍
1.基于概念 OpenId是一个以用户为中心的数字身份识别框架,它具有开放.分散.自由等特性.OpenId的创建是基于这样一个概念:我们可以通过URI(或者URL网址)来识别一个网站.同样,我们也可以 ...
- python 函数map()、filter()、reduce()
map()函数 将一个列表进行遍历,对每一个字符串进行处理: 例如: num_list = ["我","是","哈哈","太 ...