我有一个使用Spring框架及其验证器的Groovy项目对表单的输入值进行完整性检查。我想通过内置的${status.errorMessage}
在输入表单字段旁边填充Spring填充错误消息;但是,我只能在我的Model对象(来自控制器)中填充“errorMessages”。所以让我们看看一些代码。
的login.jsp:
<form method="post" action="<c:url value="/login" />">
<spring:bind path="request.username">
<label for="username"><fmt:message key="login.username"/>:
<input type="text" id="username" size="20" maxlength="50" name="username" value="${request.username}"/>
</label>
<%-- This part does NOT display the validation errors. --%>
<c:if test="${status.error}"><span class="error">${status.errorMessage}</span></c:if>
</spring:bind>
<spring:bind path="request.password">
<label for="password"><fmt:message key="login.password"/>:
<input type="password" id="password" size="20" maxlength="30" name="password" />
</label>
<%-- This part does NOT display the validation errors. --%>
<c:if test="${status.error}"><span class="error">${status.errorMessage}</span></c:if>
</spring:bind>
<input id="login" type="submit" value="Login"/>
</form>
<%-- This part does display the validation errors. --%>
<c:if test="${ec > 0}">
<p>
<c:forEach items="${errorCodes}" var="error">
<span class="error"><fmt:message key="${error.defaultMessage}"/></span><br/>
</c:forEach>
</p>
</c:if>
LoginController.groovy:
@RequestMapping(method = RequestMethod.GET, value = '/')
ModelAndView defaultView() {
ModelMap model = new ModelMap()
model.addAttribute('request', new LoginRequest())
new ModelAndView('login', model)
}
@RequestMapping(method = RequestMethod.POST, value = '/login')
ModelAndView login(
LoginRequest loginRequest, HttpServletResponse response,
HttpSession session, BindingResult br, ModelMap model
) {
validator.validate(loginRequest, br)
if (br.hasErrors()) {
model.addAttribute('request', loginRequest)
return returnWithError(br, model, 'login')
}
...
}
private ModelAndView returnWithError(BindingResult br, ModelMap model, String redirectTo) {
br.allErrors.each {error ->
log.error(error.toString())
}
def objectErrors = br.allErrors.findAll {e -> e instanceof ObjectError}
model.addAttribute('ec', br.errorCount)
model.addAttribute('errorCodes', objectErrors)
new ModelAndView(redirectTo, model)
}
LoginRequestValidator.groovy:
@Override
void validate(Object o, Errors errors) {
ValidationUtils.rejectIfEmpty(errors, 'username', 'username.empty', 'username.empty')
ValidationUtils.rejectIfEmpty(errors, 'password', 'password.empty', 'password.empty')
}
我错过了Spring Magic [TM]的哪一部分?
答案 0 :(得分:3)
我认为你的BindingResult对象应该是紧跟在LoginRequest对象之后的参数。见http://static.springsource.org/spring/docs/3.0.x/reference/mvc.html#mvc-ann-requestmapping,具体见例15.1。 BindingResult和@ModelAttribute
的排序无效答案 1 :(得分:0)
在@RequestMapping上查看Javadoc,因为我发现它在这个主题上最好: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/web/bind/annotation/RequestMapping.html
尝试以下方法:
ModelAndView login(
@Valid LoginRequest loginRequest, HttpServletResponse response,
HttpSession session, BindingResult br, ModelMap model
) {}
请参阅What does the @Valid annotation indicate in Spring?
如果这不起作用,你应该尝试将你的一些代码翻译成普通的Java并运行调试器来查看发生的事情(我知道它不是答案,只是一个想法)。
答案 2 :(得分:0)
也许您会发现these post中的kgiannakakis非常有用。 它解释了这些功能的目的以及如何处理在Spring 3.1 documentation中解释。
添加类似的东西可能会成功,不是吗?
@Controller
public class MyController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new FooValidator());
}
@RequestMapping("/foo", method=RequestMethod.POST)
public void processFoo(@Valid Foo foo) { ... }
}
看看SpringSource博客,特别是these post about new features around data binding。它可以为您的验证过程添加一些新的外观。