2009-12-10 13 views
19

validatorsをSpring MVCフレームワークの下で記述しようとしていますが、ドキュメントには目立たない省略があります。 Errorsオブジェクトにエラーを渡す呼び出しでは、ほとんどのメソッドでerrorCodeというStringパラメータが必要です。これらのエラーコードは、私が正しく理解するならば、特定のエラーメッセージのためのスタンドとして役立ちます。しかし、私は、これらのコードがどこにマップされているのかを理解することはできません。Spring MVC検証エラーコードはどこで解決されましたか?

ここでは、Spring MVCの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."); 
     } 
    } 
} 

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

答えて

15

私はデフォルトのメッセージリゾルバを使用しています。私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をグローバルに定義する方法はありません。 enhancement request for that hereがあります。 Beanの継承を使用してすべてのコントローラBeanを1つのコントローラBean定義から継承させる方法の1つは、hereです。エラーJSPタグその後、次の操作を行うことができます:あなたは、フォームに似たコントローラでメッセージを解決したい場合は何らかの理由で

+0

この情報をお寄せいただきありがとうございます。これで私のバリデーターを利用することができます。しかし、私がカスタムMessageCodeResolverで再結びたいと思ったら、どうすればいいのかを学ぶために、どこに行くのですか?また、繁栄のためにResourceBundleMessageSourceのjavadocはhttp://static.springsource.org/spring/docs/2.5.x/api/org/springframework/context/support/ResourceBundleMessageSource.htmlにあります。 –

+1

カスタムMessageCodeResolverを使用する場合は、特定のコントローラに1つを割り当てることができます。 1つのアプローチは、ここで説明するように、Bean継承を使用して、すべてのコントローラBeanを1つのコントローラBean定義から継承させることです。http://forum.springsource.org/showthread.php?t=46336現在、方法はありませんカスタムMessageCodeResolverをグローバルに定義する。 https://jira.springsource.org/browse/SPR-5187 –

+1

参考までに、グローバルなカスタムMessageCodeResolver機能は、最終的にSpring 3.1(2011)に実装されました。 [SPR-6506](https://jira.spring.io/browse/SPR-6506)も参照してください。 – vallismortis

3

これらは、MessageSourceMessagesCodeResolverで解決されています。検証エラーに対応するメッセージを出力

は、我々が議論する必要がある最後の事である:

Hereは、リファレンスマニュアルの該当するセクションです。上記の例では、名前と年齢フィールドを拒否しました。 MessageSourceを使用してエラーメッセージを出力する場合は、フィールドを拒否するときに指定したエラーコード(この場合は「名前」と「年齢」)を使用してエラーメッセージを出力します。たとえばValidationUtilsクラスを使用して(直接的または間接的に)rejectValueのいずれかの呼び出し、またはErrorsインターフェイスの他の拒否メソッドの1つを呼び出した場合、基礎となる実装では、渡されたコードだけでなく、追加のエラーコード。

+0

? –

+0

デフォルトインスタンス(DefaultMessageCodesResolver)が指定されていない場合は、そのインスタンスが使用されます。あなたはMessageSourceを登録する必要があります。それは自動的に使用されます。 –

+0

どのようにMessageSourceを登録しますか?私はmessageCodesResolverをBeanのプロパティとして見る。しかし、アプリケーション全体でMessageCodeResolverを汎用的に設定する方法はありますか? –

1

あなたはMessageCodeResolverを使用するかを定義します

//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); 
    } 
+0

私は、MessageSourceがコントローラで@Autowiredであることを指摘したい – leojh

関連する問題