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

Java 如何在自定义约束注释的约束冲突消息中显示字段名称描述?,java,bean-validation,jsr349,Java,Bean Validation,Jsr349,如何在自定义约束注释的约束冲突消息中显示字段名称描述 例如,给定以下自定义约束注释@Required、资源束ValidationMessages.properties、类Person,如何编写约束冲突消息“First Name is Required.”对于必填字段firstName和“Last Name is Required.”对于必填字段lastName @Documented @Constraint(validatedBy = {}) @Target({ ElementType.METH

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

例如,给定以下自定义约束注释
@Required
、资源束
ValidationMessages.properties
、类
Person
,如何编写约束冲突消息“First Name is Required.”对于必填字段
firstName
和“Last Name is Required.”对于必填字段
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 {};
}

public class Person {
    @Required
    private String firstName;

    @Required
    private String lastName;
}

没有可用于获取当前属性名称的API。如果有,您仍然需要执行一些字符串操作,从属性名“firstName”到显示名“firstName”

也就是说,我可以看到在
ConstraintValidatorContext
中公开当前
路径的好处,它被传递给
ConstraintValidator\isValid
。这是每个规范不可能的,但它可以作为特定于提供商的功能实现。您可以为Hibernate验证器创建一个问题请求

关于您的问题,imo的最佳解决方案是在
@Required`中添加“label
属性”:

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 {};
}
@已记录
@约束(validatedBy={})
@目标({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE})
@保留(RetentionPolicy.RUNTIME)
@空空如也
@报告违规行为
需要公共@接口{
公共抽象字符串标签();
公共抽象类[]组()默认值{};
公共抽象字符串message()默认值“{Required.message}”;

公共抽象类ConstraintViolation ConstraintViolation。。
((PathImpl)constraintViolation.getPropertyPath()).getLeafNode().getName();

如何将
标签添加到
@Replace
?请花点时间阅读中的。堆栈溢出的格式与其他站点不同。
@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 {};
}