BindingResult rejectValue表单支持对象的Map字段

时间:2012-11-08 11:34:47

标签: java spring spring-mvc spring-roo

我有一个Java类'QueAndAns',它有一个字段

private Map<String,String> questionAndAnswerMap;

在我的JSP页面上我有

<form:form  action="${submitURL}" method="POST" modelAttribute="queAndAns">  
    <c:forEach items="${queAndAns.questionAndAnswerMap}" var="questionAndAnswer"     varStatus="status">  
        <form:input     id="securityQuestions${status.index}" path="questionAndAnswerMap[${questionAndAnswer.key} ${questionAndAnswer.value}]"/>  
        <form:errors cssClass="errors" id="_securityQuestions_error_id" path="questionAndAnswerMap"/>            
    </c:forEach>  
    <input id="proceed" type="submit"  value="${fn:escapeXml(find_button)}"/>  
</form:form>

现在在我的控制器中我想看看用户是否已经回答了所有问题,否则我想用bindingResult.rejectValue返回它。我正在尝试这样的事情:

Map<String, String> questionAndAnswerMap = queAndAns.getQuestionAndAnswerMap();
    Iterator<Map.Entry<String, String>> iterator = questionAndAnswerMap.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry<String, String> map = iterator.next();
        if (null == map.getValue() || StringUtils.isEmpty(map.getValue())) {
            bindingResult.rejectValue("questionAndAnswerMap" , "err_qna_not_blank", "Please fill up the answer for security questions");
        }
    }

但它不起作用。
有什么办法可以吗?

1 个答案:

答案 0 :(得分:2)

过去几个小时我一直在努力。最后找到了解决方案:

您的路径定义应如下所示

<form:input id="securityQuestions${status.index}" path="questionAndAnswerMap['${questionAndAnswer.key}']"/>  
<form:errors cssClass="errors" id="_securityQuestions_error_id" path="questionAndAnswerMap['${questionAndAnswer.key}']"/>

您的验证应如下所示

bindingResult.rejectValue( "questionAndAnswerMap['"+map.getKey()+"']" , "err_qna_not_blank", "Please fill up the answer for security questions");

我还尝试在'BindingResult'中使用'nestedPath'标签和'pushNestedPath()'方法使其更干净(没有字符串连接)但似乎不可能。