Spring MVC中带有Bean集合的自定义绑定错误消息


问题内容

我们正在使用Spring MVC 3.0.6,但没有使用JSR
303验证,仅使用处理模型表单bean的Controller方法中使用BindingResult的Binding错误。我将尝试简化以下示例,因为问题不在于如何设计事物,因为那些决定是在我到达之前做出的。我只是想让事情在我拥有的参数范围内正常工作。

在这个特殊的表单中,我正在处理一个表单bean,它是子bean的列表,该视图允许用户添加/删除一堆这些子bean。

表单bean如下所示:

public class FormBean {
    private List<SubBean> subBeans;
    ...
}

和子bean:

public class SubBean {
    private Integer value1;
    private Date value2;
    private String value3;
}

在JSP视图中,我们正在做类似的事情:

<form:form modelAttribute="formBean">
    <spring:hasBindErrors name="formBean">
        <div class="error-box">
            <div class="error-txt">
                <form:errors path="*" cssClass="error" />
            </div>
        </div>
    </spring:hasBindErrors>

    <c:forEach items="${formBean.subBeans}" var="subBean" varStatus="subBeanStatus">
        ...
        <form:input path="subBeans[${subBeanStatus.index}].value1" />
        <form:input path="subBeans[${subBeanStatus.index}].value2" />        
        <form:input path="subBeans[${subBeanStatus.index}].value3" />
        ...
    </c:forEach>
    ...
</form:form>

当我提交的表单的值未通过Binding-Mustard时,问题就来了。例如,如果我为value1添加一个无效的int值,则会收到类似以下的错误消息:

Failed to convert property value of type java.lang.String to required type java.lang.Integer for property subBeans[0].value1; nested exception is java.lang.NumberFormatException: For input string: "sdfs"

我知道使用非嵌套bean,您可以简单地将消息添加到Resource Bunder中,形式为:

typeMismatch.beanName.fieldName="This is my custom error message!!!"

但是,像我一样,当拥有列表时,如何控制错误消息?


问题答案:

我解决此问题的方法是添加一条消息,例如“ typeMismatch.fieldName”,基本上只指定结束字段名称,而不指定bean
/列表名称。优点是可以工作,缺点是可以为任何具有相同名称的bean上的所有字段设置消息。因为我们在门户网站上工作,并且在同一WAR中部署了数百个微小的小应用程序,所以这可能是一个问题。目前,它可以工作。