2012-05-28 48 views
3

我設置了@InitBinder來爲Spring MVC控制器設置驗證器。但是,它看起來不像驗證器實際上是在運行時觸發的。使用@InitBinder驗證器似乎沒有被使用

控制器看起來是這樣的:

@Controller 
@RequestMapping("/login") 
public class LoginController { 

final private static String USER_COOKIE_NAME = "ADVPROT_CHAT_USER"; 
final private static String CURRENT_VIEW  = "login"; 
final private static String SUCCESS_VIEW  = "redirect:welcome.htm"; 

@Autowired 
private UserManagerService userManagerService; 

@Autowired 
private LoginValidator loginValidator; 

@InitBinder("login") 
protected void initBinder(WebDataBinder binder) { 
    binder.setValidator(new LoginValidator()); 
} 

@RequestMapping(method = RequestMethod.POST) 
protected String processSubmit(@Valid @ModelAttribute("login") Login login, BindingResult result, ModelMap model, HttpServletRequest request, HttpServletResponse response) throws Exception { 

    if(result.hasErrors()) { 
     return CURRENT_VIEW; 
    } else { 
     model.addAttribute("login", login); 

     String loginResultMessage = "Login successful via LDAP"; 
     User user = getUser(login.getUsername()); 
     model.addAttribute("userLoggedIn", user); 
     model.addAttribute("loginResultMessage", loginResultMessage); 

     request.getSession().setAttribute("userLoggedIn", login.getUserLoggingIn()); 
     if (login.getUserLoggingIn() != null) { 
      response.addCookie(new Cookie(USER_COOKIE_NAME, login.getUserLoggingIn().getId())); 
     } 

     return SUCCESS_VIEW; 
    } 
} 

private User getUser(String username) throws Exception { 

    return userManagerService.getUserById(username); 
} 

@RequestMapping(method = RequestMethod.GET) 
protected String initForm(ModelMap model, HttpServletRequest request) { 
    Login login = new Login(); 

    Cookie[] cookies = request.getCookies(); 
    if (cookies != null && cookies.length > 0) { 
     for (Cookie nextCookie: cookies) { 
      if (nextCookie.getName().equals(USER_COOKIE_NAME)) { 
       login.setUsername(nextCookie.getValue()); 
       break; 
      } 
     } 
    } 
    model.addAttribute("login", login); 
    return CURRENT_VIEW; 
} 
} 

在運行時,它看起來並不像驗證是做任何檢查。

如果我使用@InitBinder沒有指定模型屬性

@InitBinder 
protected void initBinder(WebDataBinder binder) { 
    binder.setValidator(new LoginValidator()); 
} 

它看起來像驗證大幹快上其他obejects解僱,我得到異常。所以,我的猜測是,我爲@InitBinder指定模型的方式有點不正確,但我不確定。

+0

請問您的驗證實現'org.springframework.validation.Validator'和實現方法'公共void驗證(對象的目標,錯誤錯誤)'? – Rigg802

回答

0

您不應在InitBinder中創建驗證程序的新實例。它看起來像:

@Autowired 
private LoginValidator loginValidator; 

@InitBinder 
public void InitBinder(WebDataBinder binder) { 
    binder.setValidator(loginValidator); 
} 

由於您使用驗證器,你必須使用@Validated而不是@Valid。我的意思是:

@RequestMapping(method = RequestMethod.POST) 
protected String processSubmit(@Validated @ModelAttribute("login") Login login, BindingResult result, ModelMap model, HttpServletRequest request, HttpServletResponse response) throws Exception { 

如果你需要一個工作示例來看看here