【发布时间】:2016-06-10 14:22:28
【问题描述】:
是否可以访问字段值,其中字段名称在注释中描述,该注释注释类中的另一个字段。
例如:
@Entity
public class User {
@NotBlank
private String password;
@Match(field = "password")
private String passwordConfirmation;
}
注释:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = FieldMatchValidator.class)
@Documented
public @interface Match {
String message() default "{}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String field();
}
现在,是否可以从 ConstraintValidator 实现类中的 User 类中访问字段密码?
编辑:
我是这样写的:
public class MatchValidator implements ConstraintValidator<Match, Object> {
private String mainField;
private String secondField;
private Class clazz;
@Override
public void initialize(final Match match) {
clazz = User.class;
final Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(Match.class)) {
mainField = field.getName();
}
}
secondField = match.field();
}
@Override
public boolean isValid(final Object value, final ConstraintValidatorContext constraintValidatorContext) {
try {
Object o; //Now how to get the User entity instance?
final Object firstObj = BeanUtils.getProperty(o, mainField);
final Object secondObj = BeanUtils.getProperty(o, secondField);
return firstObj == null && secondObj == null || firstObj != null && firstObj.equals(secondObj);
} catch (final Exception ignore) {
ignore.printStackTrace();
}
return true;
}
}
现在的问题是如何获取 User 对象实例并比较字段值?
【问题讨论】:
-
@ursa 感谢您的提示,对我帮助很大。但现在我遇到了另一个问题,请参阅编辑。
-
@zach 你还没有对象吗?
isValid方法的参数value。 -
@Jesper
value参数是private String passwordConfirmation属性的值。 -
啊,是的,我明白了。我认为没有办法从验证器的
isValid方法中获取包含属性的User对象。
标签: java reflection annotations hibernate-validator