2012-01-11 9 views
5

में वसंत वेबडाटाबिंडर सत्यापनकर्ता के साथ सह-अस्तित्व में मौजूद है क्योंकि springmvc 3.x अब jsr303 और पुराने वसंत शैली सत्यापनकर्ता का समर्थन करता है, मैं उन्हें अपने नमूना ऐप्स में मिश्रण करना चाहता हूं। लेकिन निर्दिष्ट नियंत्रक के लिए केवल एक ही विधि सक्षम है, क्या यह वसंत ढांचे या जेएसआर मानक की सीमा है?springmvc jsr303 validator एक क्रिया

मेरा नमूना कोड यहां है।

उपयोगकर्ता.जावा, डोमेन मॉडल के लिए खड़ा है, सत्यापन के लिए JSR303 का उपयोग करता है।

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

UserValidator.java, उपयोगकर्ता सत्यापन का समर्थन करने के org.springframework.validation.Validator इंटरफ़ेस लागू करता है।

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 में UserValidator सुई InitBinder एनोटेशन का उपयोग करता है।

@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"; 
    } 
} 

अगर मैं UserController में @InitBinder("user") uncomment, JSR303 सत्यापन अक्षम हो जाएगा। जबकि वर्तमान टिप्पणी कोड सत्यापन करने के लिए जेएसआर सत्यापनकर्ता का उपयोग करेगा। क्या कोई मुझे एक नियंत्रक में मिश्रण करने के लिए एक कामकाज दे सकता है?

+1

बीटीडब्ल्यू, आप प्लेसहोल्डर्स का उपयोग करके '@ आकार' बाधा के लिए संदेश में हार्ड कोडित आकार से छुटकारा पा सकते हैं, जैसे: '" उपयोगकर्ता लॉगिन आईडी अधिकतम लंबाई {अधिकतम} "' –

उत्तर

6

आप अपने सत्यापनकर्ता सीधे इस्तेमाल करते हैं और वैश्विक LocalValidatorFactoryBean जाने (JSR-303) के रूप में अच्छी तरह से अपनी कार्य करते हैं:

@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

ग्रेट, मुझे लगता है कि यह सुरुचिपूर्ण है मेरे वर्तमान की तुलना में समाधान। विशेष मॉडल विशेषता के लिए 'इनिटबिंडर' नहीं। धन्यवाद – Bigfei

+0

इससे मेरी मदद की, बहुत सराहना की – jarandaf

8

आप बजाय इसे स्थापित करने के अपने सत्यापनकर्ता जोड़ सकते हैं:

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

यह JSR303 सत्यापन पहले और फिर आपके कस्टम सत्यापनकर्ता को निष्पादित करेगा। सत्यापन विधि में सीधे सत्यापनकर्ता को कॉल करने की आवश्यकता नहीं है।

संबंधित मुद्दे