我创建了我的第一个自定义验证注释,其中验证器类作为内部类(我发现它排列得很好)。 它看起来像这样:
@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();
}
问题是我找不到格式化字符串数组“fields”的方法。它只需要使用to string方法,结果如下: 组中的一个必须不为空。 [Ljava.lang.String; @ 157d954
答案 0 :(得分:2)
如果您将fields
的类型从String[]
更改为String
,则会正确显示包含字段名称的消息。通过逗号获取split()
约束中的字段名称。
另一种选择是在约束内生成自定义消息,如下所示:
cvc.disableDefaultConstraintViolation();
cvc.buildConstraintViolationWithTemplate("error message")
.addNode("field name with error")
.addConstraintViolation();
答案 1 :(得分:0)
您使用的是哪种Bean验证实现?如果您使用的是Hibernate Validator 4.3,那么这实际上应该可行。另请参阅https://hibernate.onjira.com/browse/HV-506。
作为解决方法,为什么不使用 List ?那里默认的 toString 更明智。