Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 格式化(字符串-)数组作为bean验证消息的一部分_Java_Bean Validation - Fatal编程技术网

Java 格式化(字符串-)数组作为bean验证消息的一部分

Java 格式化(字符串-)数组作为bean验证消息的一部分,java,bean-validation,Java,Bean Validation,我用validator类作为内部类创建了我的第一个自定义验证注释(我发现这是一个很好的安排)。 看起来是这样的: @Target( { ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = {OneOfGroupNotNull.Validator.class}) @Documented public @interface OneOfGroupNotNull { // custo

我用validator类作为内部类创建了我的第一个自定义验证注释(我发现这是一个很好的安排)。 看起来是这样的:

@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();
        }
    }
}
@OneOfGroupNotNull(fields = {"a", "b", "c"})
public interface MyBean {
    String getA();
    Rarity getB();
    Boolean getC();
}
cvc.disableDefaultConstraintViolation();
cvc.buildConstraintViolationWithTemplate("error message")
    .addNode("field name with error")
    .addConstraintViolation();
问题是我找不到格式化字符串数组“字段”的方法。只需使用to string方法,结果如下:
其中一个组不能为空。[Ljava.lang.String;@157d954

如果您将
字段的类型从
String[]
更改为
String
,则带有字段名的消息将正确显示。要获取约束中的字段名,只需使用逗号
split()
即可

另一个选项是在约束内生成自定义消息,如下所示:

@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();
        }
    }
}
@OneOfGroupNotNull(fields = {"a", "b", "c"})
public interface MyBean {
    String getA();
    Rarity getB();
    Boolean getC();
}
cvc.disableDefaultConstraintViolation();
cvc.buildConstraintViolationWithTemplate("error message")
    .addNode("field name with error")
    .addConstraintViolation();

您使用的是哪种Bean验证实现?如果您使用的是HibernateValidator4.3,那么这实际上应该可以工作。另请参阅


作为一种解决方法,为什么不使用列表呢?默认的toString更合理。

1.我使用Hibernate,但它不是开箱即用的。2.列表不是批注的有效属性。您使用的是哪个版本的Hibernate Validator?我们在4.3中解决了这个问题,也许您使用的是Onder版本?我刚刚尝试了您的约束并获取错误消息“组中的一个必须不为null。[a,b,c]”。