【问题标题】:Bean Validation using complex business logic and remote service calls使用复杂业务逻辑和远程服务调用的 Bean Validation
【发布时间】:2015-06-19 06:55:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java bean-validation


    【解决方案1】:

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

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

    更新

    发明 Bean 验证是为了用优雅的简短注释(如 @Min(1))代替琐碎无聊的手动验证(如 if x != null && x < 0 then doReject()

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

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

    【讨论】:

    【解决方案2】:

    答案是肯定的。您可以开发 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);
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-02
      • 2010-12-24
      • 2012-01-13
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 2011-07-03
      相关资源
      最近更新 更多