如何在自定义约束注释的约束违例消息中显示字段名称描述?

时间:2015-04-23 15:05:21

标签: java bean-validation jsr349

如何在Bean Validation 1.1 (JSR-349)自定义约束注释的约束违规消息中显示字段名称描述?

例如,给定以下自定义约束注释@Required,资源包ValidationMessages.properties和类Person,如何组成约束违规消息" First姓名是必需的。"必填字段firstName和" 姓氏必填。"对于必填字段lastName

@Documented
@Constraint(validatedBy = {})
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@NotEmpty
@ReportAsSingleViolation
public @interface Required {
    public abstract Class<?>[] groups() default {};
    public abstract String message() default "{Required.message}";
    public abstract Class<? extends Payload>[] payload() default {};
}

在资源包中,ValidationMessages.properties

Required.message=is required.

班级Person

public class Person {
    @Required
    private String firstName;

    @Required
    private String lastName;
}

2 个答案:

答案 0 :(得分:1)

您无法使用API​​来获取当前属性名称。如果有,你仍然会做一些字符串操作,从属性名称'firstName'到显示名称“First Name”。

也就是说,我可以看到将Path中的当前ConstraintValidatorContext暴露给ConstraintValidator#isValid的好处。这是每个规范不可能的atm,但它可以作为提供者特定功能实现。您可以为Hibernate Validator here创建一个问题请求。

关于您的问题,最好的解决方案是添加'标签attribute to @ Required`:

public class Person {
    @Required(label="First Name"
    private String firstName;

    @Required(label="Last Name"
    private String lastName;
}

然后你可以在消息包中插入标签,如下所示:

Required.message={label} is required.

约束看起来像这样

@Documented
@Constraint(validatedBy = {})
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@NotEmpty
@ReportAsSingleViolation
public @interface Required {
    public abstract String label();
    public abstract Class<?>[] groups() default {};
    public abstract String message() default "{Required.message}";
    public abstract Class<? extends Payload>[] payload() default {};
}

注意,您可以添加自己喜欢的参数(前提是Java支持参数类型)。

答案 1 :(得分:0)

ConstraintViolation constraintViolation .. ((PathImpl)constraintViolation.getPropertyPath()。getLeafNode()。getName();