我想知道在中型/大型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向客户端提供有关验证错误的信息。
一些解决方案:
一些结果类
class Result<T> {
T returnedValueFromMethod;
List<ProcessingError> errors;
}
现在我的业务方法的定义如下:
public Result<Object> businessAction(User user, Entity entity)
当出现问题时我将错误信息添加到结果
什么是最好的解决方案?
答案 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
检查样板。