2011-08-17 84 views
0

JSR-303 bean验证是否可以编写可与后端服务交谈的自定义注释?使用Spring和iBatis JSR-303 bean验证

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

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

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

的感谢!

回答

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

+0

我没有想到@Inject。我们会尝试。非常感谢! – mrjabba