8

我实现了自己的注释和 ConstraintValidator (JSR-303)。在验证过程中,我想创建不同的错误代码:

public class SomeValidator implements ConstraintValidator<ConstraintAnnotation,SomeObject> {

    @Override
    public void initialize (ConstraintAnnotation constraintAnnotation) {
    }
    @Override
    public boolean isValid (SomeObject some, ConstraintValidatorContext context) {
        int parameter = some.getParameter();
        if (parameter==1){
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate("SomeObject.code.first").addConstraintViolation();
            return false;
        }
        if (parameter==2){
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate("SomeObject.code.second").addConstraintViolation();
            return false;
        }
        return true;
    }
}

但是 context.buildConstraintViolationWithTemplate() 添加了错误消息而不是代码。所以弹簧关系来扩展这样的代码:

ConstraintAnnotation.someObject

不是

SomeObject.code.second

如何添加客户代码而不是消息?

4

1 回答 1

9

问题解决得非常简单:

1) 用 {} 包围错误代码,如下所示:

context.buildConstraintViolationWithTemplate("{SomeObject.code.first}").addConstraintViolation();

2)将属性文件添加到资源文件夹(它是maven项目中的资源文件夹):

ValidationMessages_en_US.properties

ValidationMessages_en_US.properties 文件内容

SomeObject.code.first=Illegal link value

在该验证生成代码而不是消息之后,spring 将错误代码解析为实际消息。

笔记:

  1. 实际上,您可以将 ValidationMessages_en_US.properties (和其他 i18n 属性文件)放在 spring 项目中的每个位置。如果你把它放在其他位置你需要配置LocalValidatorFactoryBean,理论上,实际上我做不到,在我的情况下代码没有解析,我把属性文件放在资源文件夹中。
  2. 您可以创建自定义错误消息,例如:“错误消息。{error.code}”和“error.code”将替换为文件中的属性。请参阅JSR-303 规范
于 2013-04-12T01:12:48.003 回答