27

Spring MVCフレームワークの下でバリデーターを作成しようとしていますが、ドキュメントに明らかな欠落があります。エラーオブジェクトにエラーを渡すことを呼び出す場合、ほとんどのメソッドは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.");
       }
    }
 }

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

4

3 に答える 3

17

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

私の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つのアプローチについて説明します

于 2009-12-10T15:42:26.713 に答える
3

これらは、MessageSourceMessagesCodeResolverによって解決されます。

リファレンスマニュアルの関連セクションは次のとおりです

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

于 2009-12-10T14:25:10.197 に答える
1

何らかの理由で、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);
   }
于 2012-01-04T06:38:44.513 に答える