创建自定义JSR303的验证约束(Creating custom constraints)
????? 由于输入验证在软件开发中是必须的一件事情,特别是与用户交互的软件产品,验证用户的潜在输入错误是必不可少的一件事情,然而各种开源的验证框架也很多,为了一统标准,jsr303规范横空出世了,它定义了一些标准的验证约束,标准毕竟是标准,它不可能定义到所有的验证约束,它只是提供了一些基本的常用的约束,不过它提供了一个可拓展的自定义验证约束。下面就来说说怎么样自定义一个约束.
????? 为了创建一个自定义约束,以下三个步骤是必须的。
? Create a constraint annotation (首先定义一个约束注解)
? Implement a validator(第二步是实现这个验证器)
? Define a default error message(最后添加一条默认的错误消息即可)
??? 假定有这么一个要求,要验证用户的两次输入密码必须是相同的,非常常见的一个要求。下面就基于这个要求来自定义一个约束。
?
?单元测试如下:
package org.leochen.samples;import org.junit.BeforeClass;import org.junit.Test;import javax.validation.ConstraintViolation;import javax.validation.Validation;import javax.validation.Validator;import javax.validation.ValidatorFactory;import java.util.Set;import static junit.framework.Assert.assertEquals;import static junit.framework.Assert.assertNotNull;/** * User: leochen * Date: 11-12-20 * Time: 下午4:06 */public class TwoPasswordsTest { private static Validator validator; @BeforeClass public static void setUp() { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); validator = factory.getValidator(); } @Test public void testBuildDefaultValidatorFactory() { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); assertNotNull(validator); } @Test public void testPasswordEqualsConfirmPassword() { TwoPasswords bean = new TwoPasswords(); bean.setPassword("110"); bean.setConfirmPassword("110"); Set<ConstraintViolation<TwoPasswords>> constraintViolations = validator.validate(bean); for (ConstraintViolation<TwoPasswords> constraintViolation : constraintViolations) { System.out.println(constraintViolation.getMessage()); } assertEquals("newPassword and confirmNewPassword should be the same.", 0, constraintViolations.size()); } @Test public void testPasswordNotEqualsConfirmPassword() { TwoPasswords bean = new TwoPasswords(); bean.setPassword("110"); bean.setConfirmPassword("111"); Set<ConstraintViolation<TwoPasswords>> constraintViolations = validator.validate(bean); assertEquals(1, constraintViolations.size()); assertEquals("two password not the same", constraintViolations.iterator().next().getMessage()); } @Test public void testIfTwoPasswordWereNullShouldPast() { TwoPasswords bean = new TwoPasswords(); bean.setPassword(null); bean.setConfirmPassword(null); Set<ConstraintViolation<TwoPasswords>> constraintViolations = validator.validate(bean); assertEquals(0, constraintViolations.size()); } @Test public void testIfOneIsNullAndOtherIsNotShouldNotPast() { TwoPasswords bean = new TwoPasswords(); bean.setPassword(null); bean.setConfirmPassword("110"); Set<ConstraintViolation<TwoPasswords>> constraintViolations = validator.validate(bean); assertEquals(1, constraintViolations.size()); assertEquals("two password not the same", constraintViolations.iterator().next().getMessage()); }}?测试全部通过的
?