JSR-303 Bean Validation 介绍及 Spring MVC 服务端验证最佳实践
任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。
应用程序必须通过某种手段来确保输入参数在上下文来说是正确的。
分层的应用在很多时候,同样的数据验证逻辑会出现在不同的层,这样就会导致代码冗余和一些管理的问题。
为了避免这样或那样的情况发生,最好是将验证逻辑与相应的数据模型进行绑定。
1. JSR-303 Bean Validation
JSR 是Java Specification Requests 的缩写,是指向 JCP(Java Community Process) 提出新增一个标准化技术规范的正式请求。
任何人都可以提交 JSR,以向 Java 平台增添新的 API 和服务,已审核通过的规范涉及 Java 各个领域,有兴趣可以了解一下。
Bean Validation 是一个运行时的数据验证框架,为 JavaBean 验证定义了相应的元数据模型和 API。
默认的元数据是 Java Annotations,当然也可以使用 XML 可以对已存在的元数据信息进行覆盖和扩展。
在应用中通过使用 Bean Validation 或是你自己定义的 constraint,例如 @NotNull, @Max, @ZipCode, 就可以确保数据模型的正确性。
constraint 可以注解到字段,getter 方法,类或者接口上面。对于一些特定的需求,用户可以很容易的开发定制化的 constraint。
Hibernate Validator 做为 Bean Validation 的参考实现 .提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。
Sun validation-api.jar 中定义的规范 constraint

Hiber-Validator 自定义的几个 constraint

2. Spring MVC 服务端验证实践
只需要很简单的三个步骤,就可以在 Spring MVC 中校验数据模型,首先将需要的 jar 依赖进来
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.1.Final</version>
</dependency>
然后在需要校验数据模型上添加校验注解,如果数据模型为引入其他公司或项目,编写 xml 同样是可行的。
public class UserVO {
@NotNull(message = "uuid 不能为空!")
private String uuid;
@NotEmpty(message = "用户名称不能为空!")
private String name;
private String passwd;
private String sex;
private Date birthday;
@Length(min = 11, max = 11, message = "电话号码长度必须为11位!")
private String phone;
private String photo;
@Email(message = "电子邮箱地址不合法!")
private String email;
private String yxbz;
private String sorts;
.....setter/getter
}
最后就是验证并获取结果的过程,你可以硬编码编写通用方法在项目中使用,像下面这样。
private void validBean(Object targerBean) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<Object>> violations = validator.validate(targerBean);
for (ConstraintViolation<Object> violation : violations) {
System.out.println(violation.getMessage());
}
}
或者你可以借助 Spring MVC 封装好的 Validated 注解 和 BindingResult 对象更优雅的完成校验的事情。

本文只做抛砖引玉之用,具体项目具体场景请自行拿捏。
JSR-303 Bean Validation 介绍及 Spring MVC 服务端验证最佳实践的更多相关文章
- JSR-303 Bean Validation 介绍及 Spring MVC 服务端参数验证最佳实践
任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用很多时候同样的数据验证逻辑会出现在不同的层,这样 ...
- JSR 303 - Bean Validation 介绍及最佳实践
JSR 303 - Bean Validation 介绍及最佳实践 JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案.2009 年 12 月 ...
- JSR 303 - Bean Validation 介绍及最佳实践(转)
JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案.2009 年 12 月 Java EE 6 发布,Bean Validation 作为一个 ...
- JSR教程1——JSR 303 - Bean Validation介绍
1.Bean Validation 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情.应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的.在通常的情况下, ...
- JSR 303 - Bean Validation 是什么?
关于 Bean Validation JSR 303 - Bean Validation 是jree6 中的一项子规范,JSR 303 - Bean Validation着重解决以下实际问题: 在任何 ...
- JSR 303 - Bean Validation 模型验证
类是转载的,不知道转的哪里的. 此类依赖 JSR 303 – Bean Validation, Hibernate Validator. 代码不能直接运行.意会一下.自己改改. import com. ...
- JSR 303 - Bean Validation 简单介绍及用法
一.JSR-303简单介绍 JSR-303 是 JAVA EE 6 中的一项子规范.叫做 Bean Validation,官方參考实现是Hibernate Validator. 此实现与 Hibern ...
- 搭建Spring4+Spring MVC web工程的最佳实践
Spring是个非常非常非常优秀的java框架,主要是用它的IOC容器帮我们依赖注入和管理一些程序中的Bean组件,实现低耦合关联,最终提高系统可扩展性和可维护性,用它来辅助我们构建web工程将会感觉 ...
- Spring mvc服务端消息推送(SSE技术)
SSE技术是基于单工通信模式,只是单纯的客户端向服务端发送请求,服务端不会主动发送给客户端.服务端采取的策略是抓住这个请求不放,等数据更新的时候才返回给客户端,当客户端接收到消息后,再向服务端发送请求 ...
随机推荐
- 步步为营-30-AES加密与解密
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 2017-2018-2 20155309 南皓芯 Exp5 MSF基础应用
实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如ms08_067; 1.2 一个针对浏览器的攻击,如ms11_05 ...
- ubuntu 12.04 安装 openssh-server 失败,请问怎么该弄?
$ sudo apt-get install openssh-server Reading package lists... Done Building dependency tree Reading ...
- 《JavaScript 高级程序设计》第二章:在HTML中使用JavaScript
script 标记是 netspace 公司最早为在 html中引入 javascript代码而创造的HTML元素,并最终被 HTML规范采纳. script 标记有四个比较重要的属性: src ty ...
- Delphi自动适应屏幕分辨率的属性
https://www.cnblogs.com/zhangzhifeng/category/835602.html 这是个困惑我很长时间的问题,到今天终于得到解决了. 话说Delphi有个很强的窗体设 ...
- 为什么NULL指针也能访问成员函数?(但不能访问成员变量)
查看更加详细的解析请参考这篇文章:http://blog.51cto.com/9291927/2148695 看一个静态绑定的例子: 1 #include <iostream> 2 3 u ...
- 阿里dubbo服务注册原理解析
阿里分布式服务框架 dubbo现在已成为了外面很多中小型甚至一些大型互联网公司作为服务治理的一个首选或者考虑方案,相信大家在日常工作中或多或少都已经用过或者接触过dubbo了.但是我搜了 ...
- 移动端滑屏全应用【一】cssHandler操作基础动画函数封装
前言: 大家都知道,在移动端进行操作结点移动时,我们都会使用操作transform来代替top等用以提高性能,必要的时候还可开启3d加速.我们都会使用getComputedStyle来获取结点的最终样 ...
- 微信里面防止下拉"露底"组件
前言 在微信里面浏览页面的时候,有一个很管用的方法可以区分这个页面是原生的还是H5形式的.随便打开一个页面,用力往下扯的时候,如果页面上方出现了"黑底",黑底上有一行诸如网页由ga ...
- python 搭建一个简单的 搜索引擎
我把代码和爬好的数据放在了git上,欢迎大家来参考 https://github.com/linyi0604/linyiSearcher 我是在 manjaro linux下做的, 使用python3 ...