如何在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); }