使用带有 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;
我在 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;