1

是否可以使用 JSR-303 bean 验证来编写可以与后端服务对话的自定义注释?

我们使用“老派”的 Spring 验证器完成了这种类型的验证。在这种情况下,验证器是一个 Spring bean,可以将其他服务注入其中。然后将该验证器注入控制器。

一个例子可能是一个注释(可能是@EmailExists)来验证一个电子邮件是否已经存在。我只能使用我们的一项服务通过 SQL 查询来做到这一点。我宁愿与其他注释一起“验证”它并尽快检查它,而不必在后端服务中明确地执行它。

注意:我们使用的是 iBatis/MyBatis,所以我不能使用任何 JPA/Hibernate 技巧 :-)

谢谢!

4

1 回答 1

1

这绝对是可能的。Spring也在约束验证器中提供依赖注入支持。因此,您可以像这样在自定义验证器中简单地注入任何所需的服务:

public class EmailExistsValidator implements ConstraintValidator<EmailExists, String> {

    @Inject
    private EmailValidationService service;

    @Override
    public void initialize(EmailExists constraintAnnotation) {}

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {

        if (value == null) {
            return true;
        }

        return service.exists(value);
    }
}

根据您的具体情况,首先检查“便宜”约束可能是一个好主意,例如@NotNull并且仅当这些约束有效时才检查更昂贵的约束,例如@EmailExists.

您可以借助组序列和为您的类型重新定义的默认组序列来完成此操作。

于 2011-08-18T17:50:22.347 回答