如何在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;
}
答案 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();