3

検証アノテーション付きの Bean があります。次のコードを使用して、検証を手動でトリガーします。

 Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
 Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, validationGroup);

私の質問は、1.) 検証に失敗したフィールドを取得する方法と、2.) 関連するメッセージを取得する方法です。

.properties ファイルを使用したくありません。表示するフロントエンドはありません。しかし、それはサービスであり、検証に失敗したメッセージと検証に失敗したフィールドを含む応答を送信する必要があります。

4

2 に答える 2

4

検証に失敗したフィールドを取得するにはどうすればよいですか?

検証に失敗したフィールドは に返されますMethodConstraintViolationException。呼び出して個々の違反を取得すると、ノードをウォークしgetConstraintViolations()てフィールドを取得できます。getPropertyPath()

ただし、応答で返されたフィールド名が Bean 内のプロパティの名前と一致しない場合、たとえば、スネーク ケースの応答 (つまりuser_name) を返しているが、Bean プロパティ名がusernameである場合は、次のようにする必要があります。もう少しクリエイティブに。

Payloadこのシナリオでは、フィールドの名前をBean 検証アノテーションとして保存できます。

応答フィールド:

@JsonProperty("user_name")
@NotEmpty(message = ErrorMessageKeys.USERNAME_REQUIRED, 
          payload = {FieldNamePayload.UserName.class})
private String username;

ペイロード クラス:

public class FieldNamePayload 
{
    /**
     * Represents the field name "user_name"
     */
    public static class UserName implements ValuePayload
    {
        private static final String value = "user_name";

        @Override
        public String getValue() 
        {
            return value;
        }
    }
}

例外マッパーでペイロードを取得する:

    List<MethodConstraintViolation<?>> violations = new ArrayList<MethodConstraintViolation<?>>(exception.getConstraintViolations());

    for(MethodConstraintViolation<?> violation : violations)
    {
        String field = getFieldName(violation);
        String message = violation.getMessage();

        for(Class<? extends Payload> payload : new ArrayList<Class<? extends Payload>>(violation.getConstraintDescriptor().getPayload()))
        {
            //Retrieve field name from constraint payload
            if(payload.isAssignableFrom(FieldNamePayload.UserName.class))
            {
                field = getPayloadValue(payload);
            }
        }

        //Create an error response here!
    }

関連付けられたメッセージをどのように取得しますか?

デフォルトでは、Bean 検証フレームワークは、クラスパスのルートにあるローカライズされたファイル内のメッセージを次の命名規則で検索します。

  • ValidationMessages.propertiesデフォルトのロケール用。
  • ValidationMessages_{locale}.propertiesローカライズが必要な場合

この動作をオーバーライドし、検証メッセージが取得される場所を変更したい場合は、hibernate の検証プロバイダーを使用ResourceBundleLocatorして、に追加するカスタムを実装できますResourceBundleMessageInterpolator

ValidatorFactory validatorFactory = Validation
    .byProvider(HibernateValidator.class)
    .configure()
    .messageInterpolator(
        new ResourceBundleMessageInterpolator(
            new MyCustomResourceBundleLocator()))
    .buildValidatorFactory();
于 2013-07-04T19:04:35.733 に答える
1

1についてですが、フィールドとはどういう意味ですか? java.lang.reflect.Field? 直接アクセスすることはできません。できることは、 ConstraintViolation#getPropertyPath を呼び出してプロパティ パスを取得することです。ノードを反復する必要があり、リーフ ノードで、たとえば getName() を呼び出してプロパティ名を取得し、getKind() を呼び出してノードのタイプを決定することができます。

2に関しては、 ConstraintViolation#getMessage() は補間されたエラーメッセージを表示します

プロパティファイルを使いたくないというあなたの言いたいことはよくわかりません。Bean Validation はデフォルトで、プロパティ ファイル (組み込みファイルまたはアプリケーションに追加したファイル) からエラー メッセージを読み取ります。

于 2013-07-04T09:11:51.543 に答える