使用带有 javax 验证的国际化时如何插入字段名称?

How insert field name when using internationalization with javax validations?

我在 Spring 引导和国际化中使用 javax 验证注释。所以我有以下字段:

@Size(min = 3, max = 3, message = "{javax.validation.constraints.Size.message}")
private String currencyCode;

美国资源包有:

javax.validation.constraints.Size.message = size must be between {min} and {max}

因此,当此字段验证失败时,我会看到消息 "size must be between 3 and 3"

但我想要的是这样的消息:

javax.validation.constraints.Size.message = {fieldName}'s size must be between {min} and {max}

这将导致消息 "currencyCode's size must be between 3 and 3"

这可能吗?我是否需要覆盖一个 bean 才能使其工作?字段名称是否有预定义的属性?

您可以为 MethodArgumentNotValidException 创建处理程序

@ExceptionHandler(MethodArgumentNotValidException.class)
public Object handleMethodArgumentNotValidException(final MethodArgumentNotValidException e) { ...

您可以在其中调用

 e.getBindingResult().getFieldErrors();

这是包含有关无效字段错误的所有信息的集合,例如。字段名称,拒绝值。

接下来,像您的示例一样使用消息,并使用 org.apache.commons.lang3 中的 StrSubstitutor。只需创建参数映射

key --> fieldName , value --> currencyCode

当然你必须写一些代码,但这里是解决方案:)

默认情况下,@Size 注释不提供在消息中放置标签的选项,相反,您可以创建自己的实现,如下所示,以便它可以在您的应用程序中使用:

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = MySizeValidator.class)
public @interface MySize {

    String message() default "{javax.validation.constraints.Size.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    int min() default 0;

    int max() default Integer.MAX_VALUE;

    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RUNTIME)
    @Documented
    @interface List {

        Size[] value();
    }

    public abstract String label();
}

然后创建您自己的验证器(如 MySizeValidator)来验证 MySize 注释,如下所示

public class MySizeValidator implements ConstraintValidator<MySize, String> {

    private static final Log log = LoggerFactory.make();

    private int min;
    private int max;

    @Override
    public void initialize(MySize parameters) {
        min = parameters.min();
        max = parameters.max();
        validateParameters();
    }

    @Override
    public boolean isValid(String field, ConstraintValidatorContext constraintValidatorContext) {
        if (field == null) {
            return true;
        }
        int length = field.length();
        return length >= min && length <= max;
    }

    private void validateParameters() {
        if (min < 0) {
            throw log.getMinCannotBeNegativeException();
        }
        if (max < 0) {
            throw log.getMaxCannotBeNegativeException();
        }
        if (max < min) {
            throw log.getLengthCannotBeNegativeException();
        }
    }
}

使用以下键值

创建ValidationMessages.properties

javax.validation.constraints.mySize.message={label} 的大小必须在 {min} 和 {max} 之间

然后在您的 POJO 中,您可以放置​​这个新注释,

@MySize(min = 3, max = 3, message = "{javax.validation.constraints.mySize.message}", label = "Currency Code")
    private String currencyCode;