spring 4.0 注解数据验证1
通常情况下,数据验证都分为前台验证,后台验证。并且前台JS验证是肯定有的,那么其实验证的错误信息根本不必通过后台传过去,哪怕就是想国际化,前台JS也能够胜任。
如果前台验证足够了,那么如果还有不正确的信息传到后台去,极有可能是通过非法手段。那么我对这些信息也不必客气,直接拒接就行了,连错误信息都不必发。 基于这个思想,
后台验证可以省掉很多东西。
我们现在使用Hibernate的那一套验证,必须引入Hibernate-validator的jar包。到Maven Repository 去找就行了。如果还找不到,拿到百度云里找吧
现有POJO类:
import java.lang.reflect.Field; import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty; public class People { private int id; @NotEmpty
private String name; @Email
private String address; private int age; public final int getId() {
return id;
} public final void setId(int id) {
this.id = id;
} public final String getName() {
return name;
} public final void setName(String name) {
this.name = name;
} public final String getAddress() {
return address;
} public final void setAddress(String address) {
this.address = address;
} public final int getAge() {
return age;
} public final void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "People [id=" + id + ", name=" + name + ", address=" + address
+ ", age=" + age + "]";
} public People set(String name, Object obj) {
try {
Field f = this.getClass().getDeclaredField(name);
f.setAccessible(true);
f.set(this, obj);
} catch (NoSuchFieldException | SecurityException
| IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
return this;
} }
可以看到在属性name上有@NotEmpty,在属性address上有@Email(当然这是假装的)。
在Controller中有方法:
@RequestMapping(value="/add",method=RequestMethod.POST)
public String add(@Valid People p,BindingResult result, HttpServletRequest request) {
if(result.hasErrors())
return "error";
this.peopleService.add(p);
return "people/detail";
}
注意在参数p之前有注解@Valid,并且在p之后紧接着就是BindingResult result。BindingResult result一定要紧跟着People p。
这样如果有错误,通过代码 if(result.hasErrors()) return "error"; 直接返回到error界面,error界面甚至不必存在。。。
另外,这样还有好处,People中 age的类型是int。如果传参数是age是一个不可以转换为int的字符串怎么办?
哈哈,这时 result.hasErrors() 的返回值也是true,也就是还是会返回error界面。
补充一点:非空验证是用的最多的,你会看到有 @NotEmpty,@NotNull,@NotBlank 三个差不多的注解
1.@NotNull 用于任何引用类型,验证是不是null
2.@NotEmpty。 用于CharSequence,Collection, Map and Arrays,验证不是null并且CharSequence长度不是0,collection,Map,Array大小不是0
3.@NotBlank。用于CharSequence。 验证是不是null;如果不是null,那么trim之后验证长度是不是0
所有日常验证字符串时,还是使用@NotBlank吧
关于可以有哪些验证的注解,直接网上copy的。
|
注解 |
适用的数据类型 |
说明 |
|
@AssertFalse |
Boolean, boolean |
验证注解的元素值是false |
|
@AssertTrue |
Boolean, boolean |
验证注解的元素值是true |
|
@DecimalMax(value=x) |
BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence. |
验证注解的元素值小于等于@ DecimalMax指定的value值 |
|
@DecimalMin(value=x) |
BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence. |
验证注解的元素值小于等于@ DecimalMin指定的value值 |
|
@Digits(integer=整数位数, fraction=小数位数) |
BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence. |
验证注解的元素值的整数位数和小数位数上限 |
|
@Future |
java.util.Date, java.util.Calendar; Additionally supported by HV, if theJoda Time date/time API is on the class path: any implementations ofReadablePartial andReadableInstant. |
验证注解的元素值(日期类型)比当前时间晚 |
|
@Max(value=x) |
BigDecimal, BigInteger, byte, short,int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type ofCharSequence (the numeric value represented by the character sequence is evaluated), any sub-type of Number. |
验证注解的元素值小于等于@Max指定的value值 |
|
@Min(value=x) |
BigDecimal, BigInteger, byte, short,int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of CharSequence (the numeric value represented by the char sequence is evaluated), any sub-type of Number. |
验证注解的元素值大于等于@Min指定的value值 |
|
@NotNull |
Any type |
验证注解的元素值不是null |
|
@Null |
Any type |
验证注解的元素值是null |
|
@Past |
java.util.Date, java.util.Calendar; Additionally supported by HV, if theJoda Time date/time API is on the class path: any implementations ofReadablePartial andReadableInstant. |
验证注解的元素值(日期类型)比当前时间早 |
|
@Pattern(regex=正则表达式, flag=) |
String. Additionally supported by HV: any sub-type of CharSequence. |
验证注解的元素值与指定的正则表达式匹配 |
|
@Size(min=最小值, max=最大值) |
String, Collection, Map and arrays. Additionally supported by HV: any sub-type of CharSequence. |
验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小 |
|
@Valid |
Any non-primitive type(引用类型) |
验证关联的对象,如账户对象里有一个订单对象,指定验证订单对象 |
|
@NotEmpty |
|
验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
|
@Range(min=最小值, max=最大值) |
|
验证注解的元素值在最小值和最大值之间 |
|
@NotBlank |
|
验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |
|
@Length(min=下限, max=上限) |
|
验证注解的元素值长度在min和max区间内 |
|
|
|
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |
更多信息请参考官方文档:http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html/validator-usingvalidator.html
spring 4.0 注解数据验证1的更多相关文章
- spring 4.0 注解数据验证2
在spring 4.0 注解数据验证1中有基本的数据验证方法.还是那个POJO: package com.suyin.pojo; import java.lang.reflect.Field; imp ...
- Spring 3.0 注解
原文 :http://www.blogjava.net/ashutc/archive/2011/04/14/348270.html 另两 参考博客 : http://kingtai168.iteye. ...
- Spring 3.0 注解注入详解
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- spring(7)--注解式控制器的数据验证、类型转换及格式化
7.1.简介 在编写可视化界面项目时,我们通常需要对数据进行类型转换.验证及格式化. 一.在Spring3之前,我们使用如下架构进行类型转换.验证及格式化: 流程: ①:类型转换:首先调用Proper ...
- Spring MVC 数据验证——validate注解方式
1.说明 学习注解方式之前,应该先学习一下编码方式的spring注入.这样便于理解验证框架的工作原理.在出错的时候,也能更好的解决这个问题.所以本次博客教程也是基于编码方式.仅仅是在原来的基础加上注解 ...
- Hibernate Validation,Spring mvc 数据验证框架注解
1.@NotNull:不能为 Null,但是可以为Empty:用在基本数据类型上. @NotNull(message="{state.notnull.valid}", groups ...
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(四)
这一章大象将详细分析web层代码,以及使用Spring MVC的注解及其用法和其它相关知识来实现控制器功能. 之前在使用Struts2实现MVC的注解时,是借助struts2-conventi ...
- Spring MVC 使用介绍(十三)数据验证 (一)基本介绍
一.消息处理功能 Spring提供MessageSource接口用于提供消息处理功能: public interface MessageSource { String getMessage(Strin ...
- Spring MVC 数据验证——validate编码方式
1.导入jar包 validation-api-1.0.0.GA.jar这是比較关键的一个jar包,主要用于解析注解@Valid. hibernate-validator-4.3.2.Final.ja ...
随机推荐
- CSS3滑块菜单
在线演示 本地下载
- String类型的对象,是保存在堆里还是在栈里呢?
在Java的实现中,new出来的String对象一般是放在堆中的. 如果是 String s ="xxx"; 这种,那就是放在常量池中. JDK6将常量池放在方法区中. 方法区此时 ...
- POJ Layout
A - Layout Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit S ...
- 大话设计模式--装饰者模式 Decorator -- C++实现实例
1.装饰者模式 Decorator 动态地给一个对象添加一个额外的职责, 就添加功能来说, 装饰模式比生成子类更为灵活. 每个装饰对象的实现和如何使用这个对象分离, 每个装饰对象只关心自己的功能,不 ...
- python 正则表达式(二)
下面列举了Python3的所有符号用法,别背,千万别背,用到时来查就行. 字符 含义 . 表示匹配除了换行符外的任何字符注:通过设置 re.DOTALL 标志可以使 . 匹配任何字符(包含换行符) | ...
- Vue2.0 探索之路——vuex入门教程和思考
Vuex是什么 首先对于vuex是什么,我先引用下官方的解释. Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可 ...
- 一些有意思的面试题(持续更新) .C语言编程技巧札记
一些有意思的面试题(持续更新) http://blog.csdn.net/wangyuling1234567890/article/details/38565239 C语言编程技巧札记 http:// ...
- 关于React前端构建的一般过程 - 理论篇
概要 本文以个人阅读实践经验归纳前端架构构建过程,以Step by Step方式说明创建一个前端项目的过程.并会对每个阶段所使用的技术进行可替代分析,如Express替换Hapi或者Koa的优缺点分析 ...
- pyglet--EventLoop对象(主事件循环,用于从系统消息队列中取出消息,并派发给各个窗口)
一.识别系统消息,并派出该消息 EventLoop(应用程序的事件循环),用于循环的从系统消息队列中获取系统消息(包含消息的各种参数:如鼠标位置,事件类型,鼠标左右键,哪个键盘键等),然后派发相应的事 ...
- django学习笔记(四)表单
1.若用户刷新一个包含POST表单的页面,那么请求将会重新发送造成重复. 这通常会造成非期望的结果,比如说重复的数据库记录.如果用户在POST表单之后被重定向至另外的页面,就不会造成重复的请求了.我们 ...