SpringMVC验证框架Validation特殊用法
2016-05-01 20:46
513 查看
基本用法不说了,网上例子很多,这里主要介绍下比较特殊情况下使用的方法。
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对象。
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对象。
相关文章推荐
- 2045331 《Java程序设计》第09周学习总结
- 20145218 《Java程序设计》第04次实验报告
- 20145216史婧瑶《Java程序设计》第9周学习总结
- 20145216史婧瑶《Java程序设计》第9周学习总结
- RxJava之Subject
- struts学习-HelloWorld
- Java 利用iText生成pdf并导出
- Java的多态性
- java之Map转List
- Java学习-12.通过异常处理错误
- Java学习-11.持有对象
- javasavacript 递归优化,递归变while
- Struts之OGNL
- Java 随机生成中文姓名,手机号,邮编,住址
- java二维数组
- 深入理解Java内存模型——final
- java如何获取其它用户登录的真是IP地址
- RxJava-简介及Observable创建
- 20145225《Java程序设计》 第9周学习总结
- 20145223 《Java程序程序设计》实验报告4