Я должен создать пользовательскую ограничительную аннотацию, которая может получить доступ к значению другого поля моего боба. Я буду использовать эту аннотацию для проверки поля, потому что это зависит от значения другой, но способ, которым я определяю его компилятор, говорит, что "Значение для атрибута аннотации" моего поля "должно быть константным выражением".
Я определил его таким образом:
@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;
}
Там какой-либо путь состоит в том, чтобы определить аннотацию, таким образом, значение поля может быть переменной?
Спасибо
Проще всего сделать шаг назад: ограничение / валидатор, которое вы написали, работает на уровне поля, но то, что вы хотите обеспечить, является зависимостью между полями, т. Е. ограничение на уровне класса.
Перепишите ограничение и валидатор, чтобы они работали на уровне класса (т.е. аннотация будет размещаться в классе, а не в поле). Таким образом вы получите доступ ко всему классу. В вашем методе isValid (..) просто выполните получение для обоих полей, сравните и верните соответствующий результат.
Как сказал компилятор, аннотации должны быть постоянными (т.е. вы можете определить значение во время компиляции). Теперь, если я правильно угадаю, похоже, вы используете эту аннотацию, чтобы обозначить, что значения этих полей должны быть равны, когда пройти через валидатор поля равенства. Один из возможных подходов - использовать отражение. Вместо того, чтобы пытаться аннотировать значение, аннотируйте его именем поля
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));
В зависимости от того, что вы пытаетесь сделать, вам может понадобиться добавить логику на основе типа поля, но все тот же общий принцип.
Ознакомьтесь с этим предыдущим вопросом, есть несколько решений для проверки перекрестных полей: Проверка перекрестных полей с помощью валидатора Hibernate (JSR 303)