我在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以使其工作?是否有字段名称的预定义属性?
答案 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;