SpringMVC验证框架Validation特殊用法

基本用法不说了,网上例子很多,这里主要介绍下比较特殊情况下使用的方法。

1. 分组

有的时候,我们对一个实体类需要有多中验证方式,在不同的情况下使用不同验证方式,比如说对于一个实体类来的id来说,保存的时候是不需要的,对于更新时是必须的,可以如下配置:

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中的代码如下:

@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 的序列。

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;
}
@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. 验证多个对象

当我们在一个功能处理方法上需要验证多个模型对象时,需要通过如下形式来获取验证结果:

@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时,可以使用如下方法进行测试:

@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对象。

时间: 2024-10-11 05:44:18

SpringMVC验证框架Validation特殊用法的相关文章

SpringMVC验证框架Validation自定义注解实现传递参数到国际化资源文件

关于SpringMVC验证框架Validation的使用方法,不是本篇的重点,可参见博文SpringMVC介绍之Validation 在使用Validation时,一定有朋友遇到过一个问题,那就是:无法传递参数到国际化资源文件properties错误描述中. 举个例子: User类中 @NotEmpty(message="{password.empty.error}") private String password; 资源文件validation_zh_CN.properties中为

Struts2 验证框架 validation.xml 常用的验证规则

Struts2 验证框架 validation.xml 常用的验证规则 validation.xml 的命名规则和放置路径:文件名:<ActionClassName>-validation.xml<ActionClassName>就是要验证的Action类的名字. 要将此文件放于Class文件相同的目录.如果在Action类在struts配置中有多个action实例(action name),那么对应某个action的验证文件名规则如下:文件名:<ActionClassNam

【狂人小白】轻量级验证框架 Validation.FO 的入门与使用

Validation.FO 使用指南 框架说明 这是一个验证框架,并且是一个 独立的验证框架 ,不依赖与其他已有的框架: 可以自由的嵌入到其他框架,比如Spring.Struts等流行框架,但实质来说他是独立的,所以无所谓嵌入到哪里,如果需要在GUI桌面应用中,也是完美的: 配置简单,可自由扩展验证器,实际只要实现IValidator接口,以及在rules.fo.xml中添加相关的配置即可: 支持Spring接口 使用过程中,你会感觉好像只用了 IValidateService.validate

SpringMVC 使用验证框架 Bean Validation(上)

SpringMVC 使用验证框架 Bean Validation(上) 对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证. SpringMVC 自身对数据在服务端的校验(Hibernate Validator)有一个比较好的支持,它能将我们提交到服务端的数据按照我们事先的约定进行数据有效性验证,对于不合格的数据信息 SpringMVC 会把它保存在错误对象中(Errors接口的子类),这些错误信息我们也可以通过 Spri

struts2验证框架

Struts的验证框架 一.字段验证器1.简单的用户输入验证,在接收数据的Action同一个包下,创建一个***-validation.xml文件,然后对验证规则进行配置示例: <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"> <val

jQuery Validate验证框架详解

jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一.导入js库 <script type="text/javascript" src="<%=path %>/validate/jquery-1.6.2.min.js"></script> <script type="text/javascript" src

【转】jQuery Validate验证框架详解

jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一.导入js库 <script type="text/javascript" src="<%=path %>/validate/jquery-1.6.2.min.js"></script> <script type="text/javascript" src

数据验证框架 Apache BVal 简介

Apache BVal (源码)是实体数据验证 Java Bean Validation 的参考实现.Apache BVal 提供了 JSR 303 规范中所有内置 constraint 的实现,用于对 Bean 中的字段的值进行约束定义.描述和验证.若说 JSR 规范大渣可能还不清楚,但做过 POJO 的 Hibernate Validator 注解的朋友就知道是啥,--那为什么不使用主流的 Hibernate Validator 呢?因为单纯一个压缩包都已经 13mb 了(尽管可以有文档.源

jQuery Validate验证框架详解(转)

jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一.导入js库 <script type="text/javascript" src="<%=path %>/validate/jquery-1.6.2.min.js"></script> <script type="text/javascript" src