2

Spring MVC アプリケーションで、次のようにカスタム JSR 303 制約を開発しました。

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {})
@Pattern(regexp = EmailWithTld.PATTERN, flags = Pattern.Flag.CASE_INSENSITIVE)
public @interface EmailWithTld {

    static final String PATTERN = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";

    String message() default "{springtest.constraints.EmailWithTld.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

問題は、メッセージ値が無視され、検証エラーで表示されるメッセージが @Pattern ("must match "(?:[a-z0-9!#$%&....." )

メッセージ変数からメッセージが返されることを期待していました。

カスタム メッセージを取得する 1 つの方法は、上記の @Pattern を次のように置き換えることです。

@Pattern(message="{springtest.constraints.EmailWithTld.message}", regexp = EmailWithTld.PATTERN, flags = Pattern.Flag.CASE_INSENSITIVE)

このようにすると、設定にリソース バンドルを使用すると、正しいメッセージが表示されます。アノテーションの使用法で設定した場合、機能しません。例:

@Pattern(message="Testing 1 2 3}"

それを行う正しい方法は何ですか?

4

1 に答える 1

1

丸 3 時間費やした後、Hibernate Validator のソースを見て答えを見つけましたが、実際には非常に単純でした...

クラスに @ReportAsSingleViolation アノテーションを追加します。

これは機能します:

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {})
@ReportAsSingleViolation
@Pattern(regexp = EmailWithTld.PATTERN, flags = Pattern.Flag.CASE_INSENSITIVE)
public @interface EmailWithTld {

    static final String PATTERN = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";

    String message() default "{springtest.constraints.EmailWithTld.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}
于 2012-08-24T17:32:13.660 に答える