在JSF中处理EJB的验证错误

时间:2013-11-22 13:02:13

标签: java java-ee ejb

我想知道在中型/大型Java EE应用程序中处理验证错误的最佳方法是什么。

假设我有托管bean和facade,如下所示。

class SomeManagedBean {

    @EJB
    SomeFacade someFacade;

    public void performSomeAction() {
        (...)
        someFacade.businessAction(loggedUser, editedEntity);
        (...)
    }

}

class SomeFacadeImpl {

    public Object businessAction(User user, Entity entity) {
        if (!isInCorrectStateToDoAction(entity)) {
            // error A
        }
        (...)
        if (!hasRightToDoAction(user, entity)) {
            // error X
        }

        doAction(user, entity);
    }

}

我希望SomeFacade的businessAction应该验证他们的输入并检查它是否可以使用给定的参数执行此业务操作。这是因为我可以在应用程序的几个地方使用这种业务方法,我不想要复制验证代码。

假设我想使用FacesMessage向客户端提供有关验证错误的信息。

一些解决方案:

  • 例外 - 当参数出错时我只是抛出异常
    • 所以我必须抛出IncorrectStateForActionException,NoRightToDoActionException
    • 为什么不:我只能抛出一个例外,因此我无法通知用户有几件事:“你没有权利”,(...),“实体是不正确的状态”
    • 旁边的异常不应该用于提供我们的应用程序的逻辑
  • 一些结果类

    class Result<T> {
        T returnedValueFromMethod;
    
        List<ProcessingError> errors;
    }
    
    • 现在我的业务方法的定义如下:

      public Result<Object> businessAction(User user, Entity entity) 
      
    • 当出现问题时我将错误信息添加到结果

    • 当一切正常时,我将返回的值放到我的Result对象中并返回此对象
    • 为什么不:这看起来像是一个非常复杂的结构中的“错误代码”。由于该建议告诉“将错误代码更改为异常”,我们可以避免这样做,这是可以理解的。
  • 我们可以在外观和控制器中进行验证
    • 为什么不:重复代码
  • 仅在控制台和立面中的操作中进行验证
    • 为什么不呢:当我们从代码中的其他地方使用这个businessAction方法
    • 时可能会有危险
  • 我们可以在Facade中执行两个方法:验证和操作(查询命令分离)
    • 验证结果应包含可能发生的所有可能错误,因此结构非常奇怪
  • 我们可以做几种验证方法(从A到X的错误)
    • 很容易提供错误消息
    • 但这个解决方案似乎很愚蠢
  • 还有其他想法吗?

什么是最好的解决方案?

1 个答案:

答案 0 :(得分:0)

在业务层中进行身份验证/验证,并在发生故障时抛出异常。您可以在JSF操作方法中处理它。

E.g。

@EJB
private SomeService service;

public void someAction() {
    try {
        service.doSomething();
        addGlobalInfoFacesMessage("Doing something succeed!");
    } catch (SomeBusinessException e) {
        addGlobalErrorFacesMessage("Doing something failed with {0}", e.getMessage());
    }
}

或者,您可以放手让容器通过特定<error-page>上的<exception-type>处理它。

对于自身执行身份验证和验证,Java EE堆栈提供了诸如用于身份验证的JAAS @RolesAllowed和用于模型的JSR303 @NotNull@Size等注释。这应该减少服务方法本身内的if检查样板。