SpringMVC验证框架Validation用法
1. 分组
有的时候,我们对一个实体类需要有多中验证方式,在不同的情况下使用不同验证方式,比如说对于一个实体类来的id来说,保存的时候是不需要的,对于更新时是必须的,可以如下配置:
[java] view plain copy
public class UserModel {
@NotNull(message = "{id.empty}", groups = { First.class })
private int id;
@NotNull(message = "{username.empty}", groups = { First.class, Second.class })
private String username;
@NotNull(message = "{content.empty}", groups = { First.class, Second.class })
private String content;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
public interface First {
}
public interface Second {
}
通过 groups 对验证进行分组
在controler中的代码如下:
[java] view plain copy
@RequestMapping(value = "/save.action", method = RequestMethod.POST)
public String save(@Validated( { Second.class }) UserModel userModel, BindingResult result) {
if (result.hasErrors()) {
return "validate/error";
}
return "redirect:/success";
}
@RequestMapping(value = "/update.action", method = RequestMethod.POST)
public String update(@Validated( { First.class, Second.class }) UserModel user, BindingResult result) {
if (result.hasErrors()) {
return "validate/error";
}
return "redirect:/success";
}
2. 组序列
默认情况下,不同组别的约束验证是无序的,然而在某些情况下,约束验证的顺序却很重要,如下面两个例子:(1)第二个组中的约束验证依赖于一个稳定状态来运行,而这个稳定状态是由第一个组来进行验证的。(2)某个组的验证比较耗时,CPU 和内存的使用率相对比较大,最优的选择是将其放在最后进行验证。因此,在进行组验证的时候尚需提供一种有序的验证方式,这就提出了组序列的概念。
一个组可以定义为其他组的序列,使用它进行验证的时候必须符合该序列规定的顺序。在使用组序列验证的时候,如果序列前边的组验证失败,则后面的组将不再给予验证。
下例中声明了组 GroupA.class,GroupB.class 和 Group.class,其中 default,GroupA,GroupB 均为 Group 的序列。
[java] view plain copy
public interface GroupA {
}
public interface GroupB {
}
@GroupSequence( { Default.class, GroupA.class, GroupB.class })
public interface Group {
}
public class User {
@NotEmpty(message = "firstname may be empty")
private String firstname;
@NotEmpty(message = "middlename may be empty", groups = Default.class)
private String middlename;
@NotEmpty(message = "lastname may be empty", groups = GroupA.class)
private String lastname;
@NotEmpty(message = "country may be empty", groups = GroupB.class)
private String country;
}
[java] view plain copy
@RequestMapping(value = "/update.action", method = RequestMethod.POST)
public String register(@Validated(Group.class) User user, BindingResult result) {
if (result.hasErrors()) {
return "validate/error";
}
return "redirect:/success";
}
3. 验证多个对象
当我们在一个功能处理方法上需要验证多个模型对象时,需要通过如下形式来获取验证结果:
[java] view plain copy
@RequestMapping("/validate/multi")
public String multi(@Valid @ModelAttribute("a") A a, BindingResult aErrors, @Valid @ModelAttribute("b") B b, BindingResult bErrors) {
if (aErrors.hasErrors()) { //如果a模型对象验证失败
return "validate/error";
}
if (bErrors.hasErrors()) { //如果a模型对象验证失败
return "validate/error";
}
return "redirect:/success";
}
每一个模型对象后边都需要跟一个Errors或BindingResult对象来保存验证结果,其方法体内部可以使用这两个验证结果对象来选择出错时跳转的页面或处理的逻辑。
4. Junit测试
当自定义拓展Validation时,可以使用如下方法进行测试:
[java] view plain copy
@Test
public void testValidate() {
AnnotationDescriptor<EqualsAny> descriptor = new AnnotationDescriptor<EqualsAny>(EqualsAny.class);
EqualsAny equalsAny = AnnotationFactory.create(descriptor);
EqualsAnyValidator equalsAnyValidator = new EqualsAnyValidator();
equalsAnyValidator.initialize(equalsAny);
Assert.assertTrue(equalsAnyValidator.isValid("123", null));
}
另外再讲一点spring对自定义JSR-303限制类型支持的新特性,那就是Spring支持往ConstraintValidator里面注入bean对象。例如在EqualsAnyValidator中利用@Resource注解注入其他Bean对象。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
[Web安全之实战] 跨站脚本攻击XSS [转]
文章Points: 1. 认识XSS 2. XSS攻击 3. XSS防御(重点) 一、认识XSS先 其实什么叫攻击,很简单。获取攻击者想要的信息,就黑成功了。抓到一个 Tomcat漏洞(这不是我说的,一个认识的人说的),上传一个 JSP,里面模拟HttpClient,下载一个木马,运行。OK,搞定了。所以,没有绝对的安全。 今天,泥瓦匠带你们认识下XSS,然后关于怎么防御的问题。至于 防御的话,仁者见仁智者见智。尔等啥都不配不上的就绰见,望各位阅读者相互讨论。泥瓦匠目前是搞 JAVA的,所以例子上JAVA比较多。 Q: 什么是XSS? 为啥有这个呢? A: 全名:Cross Site Script,中文名:跨站脚本攻击。顾名思义,是指“HTML注入”纂改了网页,插入恶意的脚本,从而在用户用浏览网页的时候,控制用户浏览器的一种攻击。 XSS根据攻击的稳定性可分为三种:反射型XSS, 存储型XSS,DOM Based XSS. 二、XSS攻击 再来了解下XSS,是如何攻击?泥瓦匠这时候想到一句话:知己知彼,百战百胜吧。这攻击我们不会很详细解释,毕竟想说的是XSS防御嘛。首先...
- 下一篇
总有一个人用尽一生来爱你
出生时我们已经在母亲怀里舒服的睡了40320分钟 出生后,母亲便再也没有安静的睡眠 5岁时,我们已经吃过母亲做的5745顿饭 饭后母亲总是一个人默默的在厨房洗碗 10岁时我们已经被母亲的自行车载着去了学校780次 她不是超人,却为我们遮风挡雨 她不是良药,却为我们抚平伤痛 母亲是世界上最蹩脚的骗子 你却不愿拆穿她的谎言 长大后 你也成了一个骗子 总是报喜不报忧 给母亲寄钱 也总说自己够钱花 工作不顺心 也总说一切都好 吃康师傅 也总说伙食挺好 其实你一直清楚 无论你怎么安慰母亲 她还是会一直担心你 担心你工作是否顺利、生活是否安稳 在你熬夜工作的同时 妈妈的白发也在一天天的增长 如今又是一年母亲节 母爱是不求回报的 她想要的还是你的陪伴 妈妈关心的还是你的工作、生活是否安稳 什么?你的代码还没敲完? 你的程序设计遇到了瓶颈? 你没时间回家陪伴母亲? 礼物也没时间给母亲选一个? 不会连节日问候都没有想起吧? 归根到底,还是技术问题! 少让妈妈操心行吗? 赶紧加入龙果学院 龙果学院,专注于java体系全栈架构师培训 提升技能不再是梦 提升技能,工作稳定、顺心 就是给妈妈最好的礼物 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Red5直播服务器,属于Java语言的直播服务器