格式化(string-)数组作为bean验证消息的一部分

时间:2012-11-12 13:54:28

标签: java bean-validation

我创建了我的第一个自定义验证注释,其中验证器类作为内部类(我发现它排列得很好)。 它看起来像这样:

@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

2 个答案:

答案 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 更明智。