如何在ConstraintValidator中自动assembly服务
我正在使用Spring MVC编写我的应用程序。 我想validation用户注册时是否存在数据库中的电子邮件。 我编写了自己的注释约束,名为UniqueEmail 。
我的用户实体User.java :
@Entity @Table(name="users") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; @Column(name = "email", length = 100, nullable = false, unique = true) @NotEmpty @Email @UniqueEmail(message = "E-mail is not unique") private String email; @Column(name = "password", nullable = false) @NotEmpty @Size(min = 5, message = "size must be more 5") private String password; }
我的注释约束UniqueEmail.java :
@Target({FIELD}) @Retention(RUNTIME) @Constraint(validatedBy = UniqueEmailValidator.class) @Documented public @interface UniqueEmail { String message() default "Email is exist"; Class[] groups() default {}; Class[] payload() default {}; }
我的validation器UniqueEmailValidator.java :
@Component public class UniqueEmailValidator implements ConstraintValidator { @Autowired private UserService userService; @Override public void initialize(UniqueEmail uniqueEmail) { } @Override public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { try { return userService.isExistEmail(s); } catch (Exception e) { System.out.println(e); return false; } } }
此代码适用于应用程序。
当我运行我的测试代码时,它返回NullPointerException。 在我的validation类中, userService为null。
我已阅读http://docs.spring.io/spring/docs/3.0.0.RC3/reference/html/ch05s07.html但无法解决任何问题。
任何想法?
更新
我使用JUnit。 UserClassTest.java
@ContextConfiguration("file:src/main/webapp/WEB-INF/mvc-dispatcher-servlet.xml") public class UserClass { private static Validator validator; @BeforeClass public static void setup() { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); validator = factory.getValidator(); } @Test public void emailIsUnique() { User user = new User(); user.setEmail("mail@example.com"); // I've written exist email in DB. Set<ConstraintViolation> constraintViolations = validator.validateProperty(user, "email"); assertEquals(1, constraintViolations.size()); assertEquals("E-mail is not unique", constraintViolations.iterator().next().getMessage()); } }
更新
/WEB-INF/tiles.xml <mvc:resources mapping="/fonts/**" location="/resources/
您是否在bean上下文中配置了Validator。 如果您通过Validation.buildDefaultValidatorFactory()引导Validator ; 你绕过Spring机制,你得到一个不知道Spring bean和组件的Validator。 因此注射不起作用。 在您的测试中,您希望获得Spring提供的Validator。
如果您的主要代码正常工作,则应该直接进行测试。 您需要在测试类上使用@ContextConfiguration,有关详细信息,请参阅此内容: http ://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/testing.html
一般来说,有两种方法可以测试:
- unit testing
- 整合测试
对于unit testing,您需要创建UniqueEmailValidator的实例并在该实例上设置UserService(通常是模拟UserServer)。
对于集成测试,您需要如上所述初始化spring上下文。
你可以拨打注射所有@Autowired服务:
@Override public void initialize(UniqueEmail uniqueEmail) { org.springframework.web.context.support.SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); }
- 在@Constraint中清空validatedBy
- 你能在运行时更改注释消息吗?
- Hibernate @OneToOne @NotNull
- Springvalidation器:同时具有注释和validation器实现
- unit testing的良好模式形成了在Spring MVC中具有基于注释的validation的bean
- Bean Validation Groupinheritance不适用于Group Sequence Provider
- 如何在Spring Boot项目中禁用Hibernatevalidation
- JSF / Hibernate NotBlankvalidation
- 与Bean Validation API结合使用时,Hibernate不遵循JPA规范吗?