web-dev-qa-db-ja.com

Spring MVC検証エラーコードはどこで解決されますか?

Spring MVCフレームワークの下で validators を書き込もうとしていますが、ドキュメントに明白な省略があります。 Errors オブジェクトにエラーを渡して呼び出す場合、ほとんどのメソッドはerrorCodeという名前のStringパラメーターを予期します。これらのerrorCodesは、私が正しく理解していれば、特定のエラーメッセージの代用として機能します。しかし、私はこれらのコードがどこにマップされているかを一生理解することはできません。

これは、SpringMVCのJavadocから参照しているものの例です。

 public class UserLoginValidator implements Validator {

    private static final int MINIMUM_PASSWORD_LENGTH = 6;

    public boolean supports(Class clazz) {
       return UserLogin.class.isAssignableFrom(clazz);
    }

    public void validate(Object target, Errors errors) {
       ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName", "field.required");
       ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "field.required");
       UserLogin login = (UserLogin) target;
       if (login.getPassword() != null
             && login.getPassword().trim().length() < MINIMUM_PASSWORD_LENGTH) {
          errors.rejectValue("password", "field.min.length",
                new Object[]{Integer.valueOf(MINIMUM_PASSWORD_LENGTH)},
                "The password must be at least [" + MINIMUM_PASSWORD_LENGTH + "] characters in length.");
       }
    }
 }

誰かが私を啓発できますか?

24
James McMahon

デフォルトのメッセージリゾルバーを使用しています。

私のdispatcher-servlet.xml、 私が持っています

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

次に、クラスディレクトリの最上位に、次のようなマッピングを含む「messages.properties」というテキストファイルがあります。

error.firstname.null=Please enter your first name.
error.lastname.null=Please enter your last name.

カスタムMessageCodesResolverを使用する場合は、MessageCodeResolverインターフェイスを実装してから、次のように特定のコントローラーのリゾルバーを定義できます。

<bean id="myController">
  <property name="messageCodesResolver" ref="myMessageCodesResolver" />
</bean>

現在、カスタムMessageCodeResolverをグローバルに定義する方法はありません。 ここにそのための拡張要求 があります。 Bean継承を使用してすべてのコントローラーBeanを1つのコントローラーBean定義から継承させる1つのアプローチについて説明します ここ

16
Jacob Mattison

それらはあなたの MessageSourceMessagesCodeResolver によって解決されます。

ここ はリファレンスマニュアルの関連セクションです:

検証エラーに対応するメッセージを出力することは、私たちが議論する必要がある最後のことです。上に示した例では、名前と年齢フィールドを拒否しました。 MessageSourceを使用してエラーメッセージを出力する場合は、フィールドを拒否するときに指定したエラーコード(この場合は「name」と「age」)を使用して出力します。 (直接または間接的に、たとえばValidationUtilsクラスを使用して)rejectValueまたはErrorsインターフェイスから他の拒否メソッドの1つを呼び出すと、基礎となる実装は渡したコードだけでなく、いくつかの追加のエラーコードも登録します。

3
matt b

何らかの理由で、form:errors jspタグと同様にコントローラー内のメッセージを解決したい場合は、次のようにすることができます。

   //result is BindingResult
   List<String> errors = new ArrayList<String>();
   List<ObjectError> allErrors = result.getAllErrors();
   for (ObjectError error : allErrors) {
      String message = messageSource.getMessage(error, null);
      errors.add(message);
   }
1