I've got a Groovy project using Spring framework and its validators doing sanity-checking on my forms' input values.  I would like to have Spring populate error messages next to my input form fields via the built-in ${status.errorMessage}; however, I can only get it to populate "errorMessages" in my Model object (from the controller.)  So let's take a look at some code.
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')
}
Which part of the Spring Magic [TM] am I missing?
 
     
     
     
    