使用Spring和iBatis进行JSR-303 bean验证

时间:2011-08-17 19:36:53

标签: spring ibatis bean-validation mybatis

JSR-303 bean验证是否可以编写可以与后端服务通信的自定义注释?

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

示例可能是注释(可能是@EmailExists),以验证电子邮件是否已存在。我只能使用我们的服务之一进行SQL查询。我希望与其他注释一起“验证”这个并尽快检查,而不必明确地在后端服务中进行。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

这绝对有可能。 Spring在约束验证器中也提供dependency injection support。因此,您只需在自定义验证器中注入任何所需的服务,如下所示:

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

您可以在group sequences的帮助下为您的类型重新定义default group sequence