2012-01-11 17 views
5

Springmvc 3.x artık jsr303'ü ve eski yay stili doğrulayıcıyı desteklediğinden, bunları örnek uygulamalarımda karıştırmak istiyorum. Ancak, belirli bir kontrolör için etkin olan tek bir yöntem var, bu da, yay çatısı veya JSR standardı sınırı mı?springmvc jsr303 validator, bir eylemde ilkbahar WebDataBinder validator ile birlikte var

İşte örnek kodum.

User.java, etki alanı modeli için geçerli olup, doğrulama için JSR303'ü kullanır.

public class User{ 
    @Size(max = 16, message = "user loginId max-length is 16") 
    private String loginId; 
    //omit getter and setter 
} 

UserValidator.java, kullanıcı doğrulama desteği org.springframework.validation.Validator arayüzü uygular.

public class UserValidator implements Validator { 

    private UserService userService; 
    public boolean supports(Class<?> clazz) { 
     return User.class.isAssignableFrom(clazz); 
    } 

    public void validate(Object target, Errors errors) { 
      User u = (User) target; 

      // loginName check for new user 
      if (u.getUserId() == null && !userService.isLoginIdUnique(u.getLoginId(), null)) { 
        errors.rejectValue("loginId", "user.loginId.unique", new Object[] { u.getLoginId() }, null); 
      } 
    } 

    @Autowired 
    public void setUserService(UserService userService) { 
      this.userService = userService; 
    } 

} 

UserController.java, WebDataBinder içine UserValidator enjekte InitBinder ek açıklama kullanır. Ben UserController içinde @InitBinder("user") yorumsuz

@Controller("jspUserController") 
@RequestMapping("/sys/users") 
public class UserController { 
    private UserValidator userValidator; 

    @Autowired 
    public void setUserValidator(UserValidator userValidator) { 
     this.userValidator = userValidator; 
    } 

/*@InitBinder("user") 
    public void initBinderUser(WebDataBinder binder) { 
     binder.setValidator(userValidator); 
    }*/ 

    @RequestMapping(value = "/save") 
    public String save(@Valid User user, BindingResult bindingResult, Model model, HttpServletRequest request) { 
     if (bindingResult.hasErrors()) { 
      return "/sys/user/edit"; 
     } 
     userService.saveUser(user); 
     return "redirect:/sys/users/index"; 
    } 
} 

, JSR303 doğrulama devre dışı bırakılacaktır. Geçerli yorumlanan kod, doğrulamayı yapmak için JSR doğrulayıcıyı kullanacaktır. Birisi onları bir denetleyicide karıştırmak için bana bir çözüm sunabilir mi?

+1

BTW, bu tür yer tutucuları kullanarak '@ Boyut' için iletide sabit kodlanmış boyuttan kurtulabilirsiniz: '' kullanıcı loginId max-length {max} '' –

cevap

6

Doğruca doğrulayıcı kullanabilirsiniz ve (JSR-303), küresel LocalValidatorFactoryBean sağlayabilirsiniz yanı çalışmalarını yapın:

@Controller("jspUserController") 
    @RequestMapping("/sys/users") 
    public class UserController { 
     private UserValidator userValidator; 

     @Autowired 
     public void setUserValidator(UserValidator userValidator) { 
      this.userValidator = userValidator; 
     } 

     @RequestMapping(value = "/save") 
     public String save(@Valid User user, BindingResult bindingResult, Model model, HttpServletRequest request) { 
      this.userValidator.validate(user, bindingResult); 
      if (bindingResult.hasErrors()) { 
       return "/sys/user/edit"; 
      } 
      userService.saveUser(user); 
      return "redirect:/sys/users/index"; 
     } 
    } 
+1

Harika, bence bu zarif mevcut olana göre çözüm. Belirli bir model özniteliği için "InitBinder" yok. Teşekkürler – Bigfei

+0

Bu bana yardımcı oldu, çok takdir – jarandaf

8

yerine onu AYARI sizin doğrulayıcı ADD edebilirsiniz:

@InitBinder("user") 
public void initBinderUser(WebDataBinder binder) { 
    binder.addValidators(userValidator); 
} 

Bu, önce JSR303 doğrulamalarını ve ardından özel doğrulayıcıyı yürütür. Doğrulamayı doğrudan kaydetme yönteminde çağırmaya gerek yoktur.

İlgili konular