JSR-303 bean验证是否可以编写可以与后端服务通信的自定义注释?
我们使用“旧学校”Spring验证器完成了这种类型的验证。在这种情况下,验证器是一个Spring bean,可以注入其他服务。然后将该验证器注入控制器。
示例可能是注释(可能是@EmailExists),以验证电子邮件是否已存在。我只能使用我们的服务之一进行SQL查询。我希望与其他注释一起“验证”这个并尽快检查,而不必明确地在后端服务中进行。
注意:我们正在使用iBatis / MyBatis,所以我不能使用任何JPA / Hibernate技巧: - )
谢谢!
答案 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 。