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

时间:2017-11-03 14:41:15

标签: java spring spring-boot internationalization bean-validation

我在Spring Boot和国际化中使用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以使其工作?是否有字段名称的预定义属性?

2 个答案:

答案 0 :(得分:2)

您可以为MethodArgumentNotValidException

创建处理程序
@ExceptionHandler(MethodArgumentNotValidException.class)
public Object handleMethodArgumentNotValidException(final MethodArgumentNotValidException e) { ...

在其中你可以调用

 e.getBindingResult().getFieldErrors();

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

接下来,请使用您的示例中的消息,并使用 org.apache.commons.lang3 中的 StrSubstitutor 。只需创建参数图

键 - > fieldName,value - > CURRENCYCODE

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

答案 1 :(得分:0)

默认情况下,@ 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;