2

内部クラスとして検証クラスを使用して、最初のカスタム検証アノテーションを作成しました (これは非常によく整理されています)。次のようになります。

@Target( { ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {OneOfGroupNotNull.Validator.class})
@Documented
public @interface OneOfGroupNotNull {

    // custom annotation properties
    String[] fields();

    // required by JSR-303
    String message() default "One of group must be not null. {fields}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};

    public class Validator implements ConstraintValidator<OneOfGroupNotNull, Object> {

        private String[] fields;

        @Override
        public boolean isValid(Object bean, ConstraintValidatorContext cvc) {

            int countNotNull = 0;

            for (String field : fields) {
                try {
                    String property = BeanUtils.getProperty(bean, field);
                    if (property != null) {
                        countNotNull++;
                    }
                } catch (Exception ex) {
                    throw new RuntimeException("Validation for field " + field + " of type " + bean.getClass()+ " raised exception.", ex);
                }
            }

            return countNotNull == 1;
        }

        @Override
        public void initialize(OneOfGroupNotNull a) {
            fields = a.fields();
        }
    }
}

このバリデータで注釈が付けられた Bean クラスは、次のようになります。

@OneOfGroupNotNull(fields = {"a", "b", "c"})
public interface MyBean {
    String getA();
    Rarity getB();
    Boolean getC();
}

問題は、文字列配列の「フィールド」をフォーマットする方法が見つからないことです。to string メソッドを使用するだけで、次のような結果になります: One of group must not null. [Ljava.lang.String;@157d954

4

2 に答える 2

2

タイプをfieldsからString[]に変更した場合String、フィールド名のメッセージが正しく表示されます。制約内のフィールド名を取得するにはsplit()、コンマだけでそれを取得します。

別のオプションは、次のように、制約内でカスタムメッセージを生成することです。

cvc.disableDefaultConstraintViolation();
cvc.buildConstraintViolationWithTemplate("error message")
    .addNode("field name with error")
    .addConstraintViolation();
于 2012-11-12T14:37:56.457 に答える
0

Bean Validationのどの実装を使用していますか?Hibernate Validator 4.3を使用している場合、これは実際に機能するはずです。https://hibernate.onjira.com/browse/HV-506も参照してください。

回避策として、リストを使用してみませんか?そこでは、デフォルトのtoStringの方が賢明です。

于 2012-11-12T14:53:39.290 に答える