java - 将(字符串)数组格式化为 Bean 验证消息的一部分

标签 java bean-validation

我创建了我的第一个自定义验证注释,其中 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();
        }
    }
}

使用此 validator 注释的 bean 类可能如下所示:

@OneOfGroupNotNull(fields = {"a", "b", "c"})
public interface MyBean {
    String getA();
    Rarity getB();
    Boolean getC();
}

问题是我找不到格式化字符串数组“fields”的方法。它只需要 to string 方法,结果如下: 组之一必须不为空。 [Ljava.lang.String;@157d954

最佳答案

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

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

cvc.disableDefaultConstraintViolation();
cvc.buildConstraintViolationWithTemplate("error message")
    .addNode("field name with error")
    .addConstraintViolation();

关于java - 将(字符串)数组格式化为 Bean 验证消息的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13344985/

相关文章:

java - 将图像作为多部分表单数据上传时对 FormDataContentDisposition 进行自定义验证

java - 用正则表达式用双引号替换单引号

java - 为什么 Tomcat 会报 403 错误?

java - Java 源文件中的重音字符在 JSF 页面中无法正确显示

java - 条件 Bean 验证

java - 精确字符串匹配的 Bean 验证

java - 以下代码中出现 "Number format exception/empty string"错误的原因是什么?

java - 使用 Gradle AspectJ 将生产方面编织到测试类中

java - 如何在没有终端的情况下在其他linux计算机上打开java程序?

Java 303/349 开始日期早于结束日期验证