使用复杂的业务逻辑和远程服务调用进行Bean验证

时间:2015-04-13 20:12:57

标签: java bean-validation

我正在为Web应用程序实现一个相当复杂的输入验证,并且应该输入一个ID并调用其他几个系统,以便在持久化包含此id的对象之前检查此ID是否有效。 我正在考虑使用bean验证,但后来我发现自己创建了一个专门用于允许进行验证的bean。事实上,我需要给我的验证器不仅提供ID,还要提供一些上下文信息,以便进行远程服务调用。

您是否认为bean验证始终是进行验证的正确位置,即使它很复杂并且要求Bean范围之外的上下文进行验证?

实现业务逻辑验证规则的Spring服务是更好的选择吗?

或许其他验证器(Hibernate,Spring)可以更好地处理我的用例?

使用Bean验证进行复杂验证的最佳实践是什么?

2 个答案:

答案 0 :(得分:2)

Bean验证最适用于检查来自Web表单的用户输入是否正确。

如果您必须在其他系统中验证用户输入,则应将其作为算法中的常规步骤实现。

更新

发明Bean验证是用if x != null && x < 0 then doReject()

等优雅的短注释替换像@Min(1)那样的无聊,无聊的手动验证

如果您的身份验证不是微不足道,那么我建议您在算法中将其实现为清晰可见的操作。它比实现自定义bean验证中的隐藏细节更容易实现和维护。

但是,如果您的验证在您的应用程序中很常见,例如在不同答案中描述的法语zip验证,那么实现自定义bean验证并在许多地方重用它可能是个好主意。

答案 1 :(得分:1)

答案是肯定的。您可以开发CDI服务Bean(例如@ApplicationScoped)并将此CDI bean注入ConstraintValidator类。

您可以在Java bean验证规范页面中看到一个示例:http://beanvalidation.org/1.1/changes/

class ZipCodeValidator implements ConstraintValidator<ZipCode, String> {

@Inject
private ZipService service;

public void initialize(ZipCode zipCode) {}

public boolean isValid(String value, ConstraintValidationContext context) {
    if (value==null) return true;
    return service.isZipCodeValid(value);
}
}