14

私は、Springモジュールを使用して Spring Bean を検証するための注釈ベースのアプローチを調査しています。このチュートリアルでは、次の Bean (ゲッターとセッターは省略) を例として使用します。

public final class User {  

  @NotBlank  
  @Length(max = 80)  
  private String name;  

  @NotBlank  
  @Email  
  @Length(max = 80)  
  private String email;  

  @NotBlank  
  @Length(max = 4000)  
  private String text;  
}

特定の検証規則に従わない場合に使用されるエラー メッセージは、次の形式に従う必要があります。

bean-class.bean-propery[validation-rule]=Validation Error message

上記のクラスの例は次のとおりです。

User.email[not.blank]=Please enter your e-mail address.  
User.email[email]=Please enter a valid e-mail address.  
User.email[length]=Please enter no more than {2} characters.

メッセージ キーにクラス名が含まれているという事実には、いくつかの問題があります。

  1. クラスの名前が変更された場合、メッセージ キーも変更する必要があります。
  2. User.email と同じように検証される電子メール プロパティを持つ別のクラス (Person など) がある場合、メッセージを複製する必要があります。

    Person.email[not.blank]=メールアドレスを入力してください。
    Person.email[email]=有効な電子メール アドレスを入力してください。
    Person.email[length]={2} 文字以内で入力してください。

実際、ドキュメントでは、次のように特定のルール (@Email など) のデフォルト メッセージを構成できると主張しています。

email=email address is invalid

このデフォルト メッセージは、ルールの Bean 固有のメッセージが見つからない場合に使用する必要があります。ただし、私の経験では、これは単に機能しません。

メッセージの重複を回避する別のメカニズムは、エラー メッセージのキーをルール アノテーションに渡すことです。たとえば、@Email ルールに対して次のデフォルト エラー メッセージを定義したとします。

badEmail=Email address is invalid

このメッセージは、関連するプロパティに次のように注釈を付ける場合に使用する必要があります。

@Email(errorCode="badEmail")
private String email;

しかし、私はこれを何度も試しましたが、うまくいかないようです。この検証フレームワークを使用するときに、エラー メッセージの重複を避ける方法を見つけた人はいますか?

4

3 に答える 3

6

BeanValidator APIをざっと見てみましたが、 errorCodeConverterプロパティを試してみたいと思うかもしれません。

独自のErrorCodeConverterを実装するか、提供された実装のいずれかを使用する必要がありますか?

....
<bean id="validator" class="org.springmodules.validation.bean.BeanValidator"
    p:configurationLoader-ref="configurationLoader"
    p:errorCodeConverter-ref="errorCodeConverter" />

<bean id="errorCodeConverter" class="contact.MyErrorCodeConverter" />
....

注: configurationLoader は、チュートリアルで使用される構成 XML で定義された別の Bean です。

コンバーターの例:

package contact;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springmodules.validation.bean.converter.ErrorCodeConverter;

public class MyErrorCodeConverter implements ErrorCodeConverter {

    private Log log = LogFactory.getLog(MyErrorCodeConverter.class);

    @Override
    public String convertPropertyErrorCode(String errorCode, Class clazz, String property) {
        log.error(String.format("Property %s %s %s", errorCode, clazz.getClass().getName(), property));
        return errorCode;  // <------ use the errorCode only
    }

    @Override
    public String convertGlobalErrorCode(String errorCode, Class clazz) {
        log.error(String.format("Global %s %s", errorCode, clazz.getClass().getName()));
        return errorCode;
    }
}

これで、プロパティが機能するはずです:

MyEmailErrorCode=Bad email

class Foo {
    @Email(errorCode="MyEmailErrorCode")
    String email
}
于 2008-10-06T20:23:55.923 に答える
2

Spring 検証には、これを行う ErrorCodeConverter があります。

org.springmodules.validation.bean.converter.KeepAsIsErrorCodeConverter

これを使用すると、リソース バンドルで次のコードがチェックされます。

[errorCode.commandBeanName.fieldName、errorCode.fieldName、errorCode.fieldClassName、errorCode]

  • errorCode は実際の検証 errorCode です。空白ではなく、電子メール。
  • commandBeanName は、フォーム バッキング Bean を参照するモデル キー名と同じです。
  • fieldName はフィールドの名前です。
  • fieldClassName は、フィールド クラス名です。java.lang.String、java.lang.Integer

たとえば、キー「formBean」によってモデルで参照される Bean があり、タイプ java.lang.String のフィールド emailAddress に電子メール アドレスが含まれていない場合、errorCode 電子メールが発生します。検証フレームワークは、次のメッセージ コードの解決を試みます。

[email.formBean.emailAddress、email.emailAddress、email.java.lang.String、email]

errorCode が次のように errorCode "badEmail" に置き換えられた場合:

@Email(errorCode="badEmail")

フレームワークが解決しようとするメッセージ コードは次のとおりです。

[badEmail.formBean.emailAddress、badEmail.emailAddress、badEmail.java.lang.String、badEmail]

errodCode を同じに保つことをお勧めします。したがって、関連付けられた errorCode を持つすべてのフィールドに 1 つのメッセージを使用できます。特定のフィールドのメッセージをより具体的にする必要がある場合は、コード errorCode.commandBeanName.field を使用してメッセージをリソース バンドルに追加できます。

于 2012-06-22T14:41:30.393 に答える
0

ファイルに次の Bean を追加しapplicationContext.xmlます。

<bean id="configurationLoader"
    class="org.springmodules.validation.bean.conf.loader.annotation.AnnotationBeanValidationConfigurationLoader" />

<!-- Use the error codes as is. Don't convert them to <Bean class name>.<bean field being validated>[errorCode]. -->    
<bean id="errorCodeConverter"
    class="org.springmodules.validation.bean.converter.KeepAsIsErrorCodeConverter"/>

 <!-- shortCircuitFieldValidation = true ==> If the first rule fails on a field, no need to check 
    other rules for that field -->   
<bean id="validator" class="org.springmodules.validation.bean.BeanValidator"
    p:configurationLoader-ref="configurationLoader"
    p:shortCircuitFieldValidation="true" 
    p:errorCodeConverter-ref="errorCodeConverter"/>
于 2016-09-07T16:05:29.743 に答える