Переменное поле в ограничительной аннотации

Я должен создать пользовательскую ограничительную аннотацию, которая может получить доступ к значению другого поля моего боба. Я буду использовать эту аннотацию для проверки поля, потому что это зависит от значения другой, но способ, которым я определяю его компилятор, говорит, что "Значение для атрибута аннотации" моего поля "должно быть константным выражением".

Я определил его таким образом:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=EqualsFieldValidator.class)
@Documented
public @interface EqualsField {
    public String field();

    String message() default "{com.myCom.annotations.EqualsField.message}";

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

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

public class EqualsFieldValidator implements ConstraintValidator<EqualsField, String>{

    private EqualsField equalsField;

    @Override
    public void initialize(EqualsField equalsField) {
        this.equalsField = equalsField;     
    }

    @Override
    public boolean isValid(String thisField, ConstraintValidatorContext arg1) {
        //my validation
    }

}

и в моем бобе я хочу что-то вроде этого:

public class MyBean{

     private String field1;

     @EqualsField(field=field1)
     private String field2;
}

Там какой-либо путь состоит в том, чтобы определить аннотацию, таким образом, значение поля может быть переменной?

Спасибо

13
задан Javi 18 March 2010 в 11:49
поделиться

3 ответа

Проще всего сделать шаг назад: ограничение / валидатор, которое вы написали, работает на уровне поля, но то, что вы хотите обеспечить, является зависимостью между полями, т. Е. ограничение на уровне класса.

Перепишите ограничение и валидатор, чтобы они работали на уровне класса (т.е. аннотация будет размещаться в классе, а не в поле). Таким образом вы получите доступ ко всему классу. В вашем методе isValid (..) просто выполните получение для обоих полей, сравните и верните соответствующий результат.

13
ответ дан 2 December 2019 в 00:45
поделиться

Как сказал компилятор, аннотации должны быть постоянными (т.е. вы можете определить значение во время компиляции). Теперь, если я правильно угадаю, похоже, вы используете эту аннотацию, чтобы обозначить, что значения этих полей должны быть равны, когда пройти через валидатор поля равенства. Один из возможных подходов - использовать отражение. Вместо того, чтобы пытаться аннотировать значение, аннотируйте его именем поля

public class MyBean{

     private String field1;

     @EqualsField("field1")
     private String field2;
}

Затем в своем валидаторе вы можете прочитать имя поля и использовать отражение для доступа к нему

Object o = object.getClass().getDeclaredField(annotationValue).get(object);
o == object.(field with annotation) OR
o.equals(object.(field with annotation));

В зависимости от того, что вы пытаетесь сделать, вам может понадобиться добавить логику на основе типа поля, но все тот же общий принцип.

0
ответ дан 2 December 2019 в 00:45
поделиться

Ознакомьтесь с этим предыдущим вопросом, есть несколько решений для проверки перекрестных полей: Проверка перекрестных полей с помощью валидатора Hibernate (JSR 303)

0
ответ дан 2 December 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: