Java EE前端方法中处理服务层异常

2023-11-22

我维护一个 Web 应用程序,其中有一个带有 JSF 标签的页面<f:event。我重写了服务类中的一个方法,让它抛出业务异常。但是,当抛出业务异常时,它不会被托管 bean 捕获,并且异常会显示在页面上。看来我的代码try/catch不起作用。

在 XHTML 中:

<f:event listener="#{resourceBean.init(enrollment)}" type="preRenderView" />

Managed Bean 中的侦听器方法:

private boolean canCreateResource;

public void init(Enrollment enrollment) {
    (...)

    try {
        canCreateResource = resourceService.canCreateResource(enrollment);
    } catch (BusinessException e) {
        canCreateResource = false;
    }
}

服务类中的方法:

public boolean canCreateResource(Enrollment enrollment) {
    if (...) {
        if (mandateService.isCoordinator(user, course)) {
            return true;
        } else {
            throw new BusinessException("Undefined business rule.");
        }
    }

    return false;
}

根据我在其他网站上读到的内容,我想我必须实现一些 JSF 的处理程序类。但哪个以及如何?


EDITED

OBS 1:BusinessException类扩展RuntimeException class.

OBS 2:属性canCreateResource创建是为了控制按钮的呈现。


这是因为你扔了一个RuntimeException来自 EJB。

当这样的RuntimeException没有注释为@ApplicationException,然后 EJB 容器会将其包装在javax.ejb.EJBException并重新抛出它。这样做是因为运行时异常是usually仅用于指示代码逻辑中的错误,即程序员的错误,而不是最终用户的错误。你知道,NullPointerException, IllegalArgumentException, IndexOutOfBoundsException, NumberFormatException和朋友。这允许 EJB 客户端对此类运行时异常有一个捕获点,例如catch (EJBException e) { There's a bug in the service layer or in the way how we are using it! }

如果你尝试过catch (Exception e)并检查了实际的异常,那么您就会注意到这一点。

修复你的BusinessException类相应地添加该注释,然后它将被识别为真正的应用程序异常,并且不会被包装在EJBException:

@ApplicationException(rollback=true)
public class BusinessException extends RuntimeException {
    // ...
}

请注意,如果您抛出非RuntimeException,那么你仍然需要保留注释,明确地使用rollback=true,因为默认情况下它不会执行回滚,与RuntimeException没有注释。

@ApplicationException(rollback=true)
public class BusinessException extends Exception {
    // ...
}

总结:

  1. RuntimeException从事务性 EJB 方法抛出的异常将执行完全回滚,但异常将被包装在EJBException.
  2. RuntimeException with @ApplicationException来自事务性 EJB 方法将仅在以下情况下执行完全回滚rollback=true是明确设置的。
  3. Exception来自事务性 EJB 方法将不会执行完全回滚。
  4. Exception with @ApplicationException来自事务性 EJB 方法将仅在以下情况下执行完全回滚rollback=true是明确设置的。

注意@ApplicationException继承自自定义异常的所有子类,因此您无需对所有子类重复它。最好的办法是将其作为抽象类。另请参阅下面链接的相关问题中的示例。

也可以看看:

  • 让表示层(JSF)处理来自服务层(EJB)的业务异常
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java EE前端方法中处理服务层异常 的相关文章

  • 使用 application.properties 在 Spring Boot 中外部化 logback.xml 的位置

    如何使用 application properties 在 Spring Boot 中自定义 logback xml 的位置 我在下面尝试过 但不起作用 应用程序属性 logging config home dev 01 Documents
  • CDI 和 EJB 相比如何?相互影响?

    我很难理解两者如何相互作用以及它们之间的界限在哪里 它们重叠吗 他们之间有裁员吗 我知道两者都有相关的注释 但我无法找到两者的完整列表和简短描述 不确定这是否有助于澄清它们的不同之处或重叠之处 真的只是很困惑 我 认为我 对 EJB 相当了
  • 来自外部 DLL 的未处理的 DivideByZero 异常 - C#

    我有一个 C net 4 0 程序 其主要功能是从外部 FTP 库 项目引用的 dll 调用方法 逻辑位于 try catch 块中 catch 会打印错误 异常处理程序有一个通用参数 catch Exception ex IDE是VS 有
  • JSF 1.2:如何在同一视图上的回发中保持请求范围的托管 bean 处于活动状态?

    是否可以在同一页面上的回发过程中保持请求作用域的 bean 处于活动状态 一般的问题是 bean 在请求结束时被丢弃 并在每次表单提交时重新创建 例如动态操作背后的布尔值disabled readonly and rendered重置为默认
  • JavaScript 中是否存在不可捕获的异常?

    任何 javascript 运行时 浏览器 Node 等 是否会抛出无法捕获的异常 在 javascript 环境中遇到的所有异常是否都可以在 try catch 语句中捕获 If by 例外情况您的意思是任何破坏脚本的异常条件 那么它们都
  • 如何使用 Python 正确传播错误消息

    我对正确的 Python 错误处理有点陌生 并且我很难找到处理多种方法链中的错误的最佳方法 我有3种方法 a b c a正在打电话b and b正在打电话c 如何从方法中传播错误c回到方法a所以我可以例如将其存储在某处或在 API 响应期间
  • 在哪里使用 EJB 3.1 和 CDI?

    我正在制作一个基于 Java EE 的产品 我在其中使用玻璃鱼 https en wikipedia org wiki GlassFish3 和 EJB 3 1 我的应用程序有会话bean https en wikipedia org wi
  • Image.FromStream() 方法返回 Invalid Argument 异常

    我正在从智能相机成像器捕获图像 并通过套接字编程从相机接收字节数组 NET 应用程序是客户端 相机是服务器 问题是我在运行时收到 System InvalidArgument 异常 private Image byteArrayToImag
  • PrimeFaces 打印不适用于 p:chart

    我正在使用 primeface 打印 如下所示
  • 将方法参数/参数传递给复合组件操作属性

    标题确实说明了一切 我尝试过 但失败并出现以下错误 Illegal attempt to pass arguments to a composite component lookup expression i e cc attrs iden
  • Python 中的“断言”有什么用?

    什么是assert意思是 它是如何使用的 The assert语句几乎存在于所有编程语言中 它有两个主要用途 它有助于在程序早期发现问题 原因明确 而不是等到其他操作失败时才发现问题 例如 Python 中的类型错误在实际引发错误之前可能会
  • 不支持的major.minor版本52.0错误[重复]

    这个问题在这里已经有答案了 我有在 JDK 1 8 上编译的代码 我创建了 war 文件并将其部署在运行 JRE 1 8 的 Ubuntu 服务器中的 Tomcat8 上 我打开主页的时候出现这个错误 java lang Unsupport
  • JSF中直接更改URL来限制用户访问页面

    我的应用程序中有两种用户 客户和卖家 我正在使用一个PhaseListener在JSF中防止用户在未登录的情况下访问页面 但在登录后我不知道如何防止用户更改地址栏中的URL并访问他也不允许的页面 例如 阻止客户访问卖家页面 有谁知道我如何防
  • jsf中的会话注销问题

    我正在开发一个 Web 应用程序 并使用框架 jsf hibernate 和 spring 应用程序中有不同类型的用户 根据此处登录的用户类型 我为不同的用户类型启用菜单中的链接 用户登录后 会向用户提供菜单栏中的注销链接 我已经编写了 l
  • 关于捕获异常的良好实践

    我正在用 C 11 编写一个小程序 并且第一次真正使用异常 我有一个关于如何有效捕获异常的问题 经过一番谷歌搜索后我仍然没有答案 这是问题 通过 const 左值引用捕获异常还是通过 const 右值引用捕获异常 哪个更有效 或推荐 在代码
  • 为什么单线程异常会导致整个程序崩溃(如何防止这种情况?)

    例如 如果我跑步 int x 0x00000 程序崩溃了 但为什么整个程序崩溃而不是单个线程崩溃呢 我创建了多个连续睡眠的线程来测试这一点 有什么方法可以让当前线程退出 而不是整个程序 在Windows上使用winapi Thanks 但为
  • Java 中的异常捕获

    Java 中有一些预定义的异常 如果抛出这些异常 就会报告发生了严重的事情 你最好改进你的代码 而不是在 catch 块中捕获它们 如果我理解正确的话 但我仍然发现许多程序中有以下内容 catch IOException e catch F
  • 由于 3rd 方库的位置,启动 Solr cloud 时出错

    我尝试迁移到 Solr 3 1 我的项目使用 Dataimport handler 当我启动 solr 时 它问我找不到 SolrCoreAwar 我将以下文件复制到 lib 目录 apache solr dataimporthandler
  • java中永远不会出现的异常

    我为点和向量编写一个类 我想用它们来计算向量的点和范数 这些是点类和向量类 public class Point public float x y public class MyVector public Point start end 我
  • glassfish-embedded-maven-plugin - 如何部署资源

    我为用户提供了一种快速 简单的方法来通过 glassfish embedded maven plugin 部署我的 Java EE 6 应用程序 因此他们不必安装和配置独立的 glassfish 但是 我在资源部署方面遇到了麻烦 该应用程序

随机推荐