4

Spring MVC 3.0.6を使用していますが、JSR 303検証は使用しておらず、モデルフォームBeanを処理するControllerメソッドでBindingResultを使用したBindingエラーのみを使用しています。到着前に決定が下されたため、問題は物事がどのように設計されているかではないため、以下の例を簡略化してみます。私は自分が持っているパラメータの範囲内で物事を正しく機能させようとしているだけです。

私が取り組んでいるこの特定のフォームには、サブBeanのリストであるフォームBeanがあり、ユーザーがこれらのサブBeanの束を追加/削除できるようになっています。

フォームBeanは次のようになります。

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

そしてサブビーン:

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の場合、次の形式でResourceBunderにメッセージを追加するだけで済みます。

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

しかし、私と同じように、リストがある場合、どのようにエラーメッセージを制御しますか?

4

4 に答える 4

2

これを解決する方法は、「typeMismatch.fieldName」のようなメッセージを追加することでした。基本的には、Bean/リスト名ではなく、終了フィールド名のみを指定します。長所は機能することです。短所は、同じ名前の任意の Bean のすべてのフィールドにメッセージを設定することです。私たちはポータルに取り組んでおり、何百もの小さなアプリがすべて同じ WAR にデプロイされているため、これは今後問題になる可能性があります。今のところ、動作します。

于 2013-02-07T17:54:05.943 に答える
2

リソース バンドルによって提供されるメッセージを取得する場合は、最初に登録済みの messageSource インスタンスが必要です。

<bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames" value="ValidationMessages"/>
</bean>

それで、

@Autowired
private MessageSource messageSource;

リソース バンドルからメッセージを取得するには、

for (Object object : bindingResult.getAllErrors()) {
    if(object instanceof FieldError) {
        FieldError fieldError = (FieldError) object;

    // Use null for second parameter if you do not use i18n
    String message = messageSource.getMessage(fieldError, null);
    }
}

バリデータは次のようになります。

errors.rejectValue("<FIELD_NAME>", "typeMismatch.beanName.fieldName", new Object [] {"123"}, null);

これにより、目標を達成するためにどのように進むことができるかについてのアイデアが得られます。

于 2013-01-23T22:11:42.023 に答える
1

DefaultMessageCodesResolverクラスのドキュメントを確認する必要があります。Listタイプまたはタイプのフィールドを操作するときに使用できるエラー コードを見つけることができますMap

于 2014-10-30T10:08:52.967 に答える