代码之家  ›  专栏  ›  技术社区  ›  Vivin Paliath

将服务自动连接到验证程序

  •  10
  • Vivin Paliath  · 技术社区  · 14 年前

    这个例子有点做作;我简化了它,去掉了一些无关的细节,并把重点放在我遇到的问题上。我有一个如下的验证器:

    @Component
    public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> {
    
        @Autowired
        UsernameService usernameService;
    
        @Override
        public void initialize(UniqueUsername uniqueUsername) {
        }
    
        @Override
        public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
            return !usernameService.exists(s);
        }   
    }
    

    @RequestMapping
    public void checkUsername(Model model, User user) {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
    
        Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "username");
        model.addAttribute("error", constraintViolations.size() > 0);
    }
    

    然而,我不断得到一个 NullPointerException usernameService null . 为什么不自动连线?起初我认为这是因为我没有用 @Component UsernameService 类已被注释为 @Service

    我是Spring新手,所以我甚至不确定将服务连接到验证器是否合适。我做错什么了?

    2 回复  |  直到 14 年前
        1
  •  13
  •   axtavt    14 年前

    在春天,你需要获得 ValidatorFactory (或 Validator 本身)通过 LocalValidatorFactoryBean 而不是 Validation.buildDefaultValidatorFactory() ,如上所述 in the reference

    @Autowired
    Validator validator;
    
    @RequestMapping 
    public void checkUsername(Model model, User user) { 
        Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "username"); 
        model.addAttribute("error", constraintViolations.size() > 0); 
    } 
    

    -

    <bean id="validator"
        class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
    

    但也许更好的方法是使用springmvc的自动验证 @Valid 注释:

    @RequestMapping  
    public void checkUsername(Model model, @Valid User user, BindingResult result) {  
        if (result.hasErrors()) {   
            ...
        }
    }
    

    <mvc:annotation-driven/> 在配置文件中。

        2
  •  0
  •   Teja Kantamneni    14 年前

    而不是创建一个新的验证器,你必须自动连线或注入它到控制器。这个 NPE