让表示层(JSF)处理来自服务层(EJB)的业务异常

2024-04-11

更新提供的实体的 EJB 方法(使用 CMT):

@Override
@SuppressWarnings("unchecked")
public boolean update(Entity entity) throws OptimisticLockException {
    // Code to merge the entity.
    return true;
}

这将抛出javax.persistence.OptimisticLockException,如果检测到并发更新,则由调用者(托管 bean)精确处理。

public void onRowEdit(RowEditEvent event) {
    try {
        service.update((Entity) event.getObject())
    } catch(OptimisticLockException e) {
        // Add a user-friendly faces message.
    }
}

但这样做会产生额外的依赖javax.persistence表示层上的 API 是强制性的,这是一种导致紧耦合的设计味道。

应该将异常包装在哪个异常中,以便紧耦合问题可以完全省略吗?或者是否有一种标准方法来处理此异常,从而不会导致在表示层上强制执行任何服务层依赖项?

By the way, I found it clumsy to catch this exception in the EJB (on the service layer itself) and then return a flag value to the client (JSF).


创建一个自定义服务层特定的运行时异常,其注释为@ApplicationException http://docs.oracle.com/javaee/7/api/javax/ejb/ApplicationException.html with rollback=true.

@ApplicationException(rollback=true)
public abstract class ServiceException extends RuntimeException {}

为一般业务异常创建一些具体的子类,例如约束违反、所需实体,当然还有乐观锁。

public class DuplicateEntityException extends ServiceException {}
public class EntityNotFoundException extends ServiceException {}
public class EntityAlreadyModifiedException extends ServiceException {}

有的可以直接扔掉。

public void register(User user) {
    if (findByEmail(user.getEmail()) != null) {
        throw new DuplicateEntityException();
    }

    // ...
}
public void addToOrder(OrderItem item, Long orderId) {
    Order order = orderService.getById(orderId);

    if (order == null) {
        throw new EntityNotFoundException();
    }

    // ...
}

其中一些需要全局拦截器。

@Interceptor
public class ExceptionInterceptor implements Serializable {

    @AroundInvoke
    public Object handle(InvocationContext context) throws Exception {
        try {
            return context.proceed();
        }
        catch (javax.persistence.EntityNotFoundException e) { // Can be thrown by Query#getSingleResult().
            throw new EntityNotFoundException(e);
        }
        catch (OptimisticLockException e) {
            throw new EntityAlreadyModifiedException(e);
        }
    }

}

它被注册为默认拦截器(在所有 EJB 上),如下所示ejb-jar.xml.

<interceptors>
    <interceptor>
        <interceptor-class>com.example.service.ExceptionInterceptor</interceptor-class>
    </interceptor>
</interceptors>
<assembly-descriptor>
    <interceptor-binding>
        <ejb-name>*</ejb-name>
        <interceptor-class>com.example.service.ExceptionInterceptor</interceptor-class>
    </interceptor-binding>
</assembly-descriptor>

作为一般提示,在 JSF 中,您还可以有一个全局异常处理程序,它只添加一个 faces 消息。当开始时这个启动示例 https://stackoverflow.com/questions/30464321/log-runtime-exceptions-using-log4j-in-jsf-web-application/30464553#30464553,你可以这样做YourExceptionHandler#handle() method:

if (exception instanceof EntityAlreadyModifiedException) { // Unwrap if necessary.
    // Add FATAL faces message and return.
}
else {
    // Continue as usual.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让表示层(JSF)处理来自服务层(EJB)的业务异常 的相关文章

  • 处理异步并行任务的多个异常

    Problem 多个任务并行运行 所有任务 没有任务或其中任何任务都可能抛出异常 当所有任务完成后 必须报告所有可能发生的异常 通过日志 电子邮件 控制台输出 等等 预期行为 我可以通过 linq 使用异步 lambda 构建所有任务 然后
  • 捕获 SQLAlchemy 异常

    我可以使用什么捕获 SQLAlechmy 异常的上层异常 gt gt gt from sqlalchemy import exc gt gt gt dir exc ArgumentError CircularDependencyError
  • Elasticsearch 关于“空索引”的查询

    在我的应用程序中 我使用了几个elasticsearch索引 它们在初始状态下不包含索引文档 我认为这可以称为 空 该文档的映射是正确且有效的 该应用程序还有一个包含实体的关系数据库 这些实体可能具有在 elasticsearch 中关联的
  • dalvikvm中Android异常

    当我在手机上启动应用程序时 我从日志中收到很多以下错误 E dalvikvm 2052 No free temp registers E dalvikvm 2052 Jit aborting trace compilation revert
  • JSF-2 应用程序中的服务器端计时器

    在我正在开发的 JSF 2 应用程序中 当用户执行操作时 我需要启动服务器端计时器 这个计时器必须与应用程序本身相关 因此它必须在用户会话关闭时继续存在 为了解决这个问题 我想使用 java util Timer 类在应用程序范围的 bea
  • 从 ADF Faces JSF 1.2 中的托管 bean 构造函数导航

    是否可以从托管 bean 的构造函数导航到另一个页面 视图 如果发生任何异常 我希望进行此重定向 我尝试了很多方法 Try 1 getFacesContext responseComplete getFacesContext getAppl
  • Richfaces 与 Internet Explorer 11 的兼容性问题

    我正在使用 RichFaces JSF 开发 Web 应用程序 该应用程序在 Safari Mozilla Chrome 和 IE 9 上的表现符合预期 但是 我在 IE 11 上遇到了严重的兼容性问题 当 rich modalPanel
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • 使用异步任务

    如果这是一个简单的问题 我很抱歉 但我对此很陌生并且仍在学习 我有一个应用程序 当我的用户在输入详细信息后单击按钮登录时 它因 android os NetworkOnMainThreadException 崩溃 我发现这是因为我正在主线程
  • JSF 中基于两个组件的组合的验证/转换

    我正在开发一个 JSF Web 应用程序 我需要使用周期性作为数据结构 以下是我使用的 Java 类 public class Periodicity implements Serializable private Integer valu
  • C++,set_terminate 是每个线程本地的吗?

    Should set terminate get terminate在 C 2011 或 C 2003 中为多个线程设置不同的终止异常处理器 例如 如果我有程序并将终止处理程序设置为func 1 然后我启动3个线程 新线程中的终止处理程序是
  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 如何检测当前的 JSF 版本?

    我正在开发 jsf webapp 现在我需要知道我正在使用什么 JSF 版本 我在哪里可以查到这个 提前致谢 您的意思是 以编程方式 你可以从Package getImplementationVersion http docs oracle
  • Python 2 的 `exceptions` 模块在 Python3 中丢失了,它的内容到哪里去了?

    一位朋友提到 对于 Python 2 假设您在命令行上的路径环境变量中有它 pydoc exceptions 非常有用 知道它应该可以为他每周节省几分钟的网络查找时间 我自己每周都会用谷歌搜索一次例外层次结构 所以这对我来说也是一个有用的提
  • Spring Integration中的异常:如何记录但不拦截

    假设我有一个基本的 Spring 集成流程 例如
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL 自 Java EE 7 / EL 3.0 起不再工作

  • 如何让div与包含td的高度相匹配?

    我沿着桌子的一排布置了三个 面板 一个比另外两个高 我希望所有三个面板都与最高的一个的高度相匹配 我尝试将 div 的样式设置为 height 100 但是即使包含的 tds 增长 短面板仍然很短 我的 HTML 是由 JSF 生成的 因此
  • 使用 ui:repeat 和 b:carousel?

    环境 我正在使用 JSF2 2 Bootsfaces 0 9 1 Primefaces 6 0 JEE7 和 Hibernate 5 2 以及 MySQL 5 7 DB 我拥有的 我有一个包含一组图像的模型 该集合包含我的自定义 Image

随机推荐

  • 在 Python 中列出所有 Google Drive 文件和文件夹并保存 ID

    我正在尝试编写一个程序来将文件夹和所有内容 包括子文件夹等 复制到另一个文件夹 我可能过于复杂化了 但我觉得第一步是获取与它们关联的所有文件名和 ID 并将它们保存到两个列表中 一个用于文件 一个用于文件夹 我无法让我的程序递归地遍历所有子
  • 无法验证 AzureAD 本机客户端应用程序

    我已经注册了一个 AzureAD 应用程序 它是公共客户端 本机客户端 我在门户中使用 Azure 生成的标准代码 重要的是 static App clientApp PublicClientApplicationBuilder Creat
  • 在Java中,我们可以将一个类分成多个文件吗

    是否有可能使用Java将一个类划分为多个物理文件 不 整个类必须位于 Java 的单个文件中 如果您正在考虑 C 的 部分类型 功能 那么 Java 中没有类似的功能 如果您没有想到 C 请忽略此
  • 带有 rpi 主站和从站的 Profibus [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我的任务是使用 Rpi 和 Rs 485 转换器构建 profibus 主站和从站网络 一个 Rpi 将成为主设备 另一个将成为从设备
  • 无法加载 RSA 公钥

    我正在尝试读取如下所示的 RSA 公钥 但在第 6 行出现异常 java security spec InvalidKeySpecException java security InvalidKeyException IOException
  • 将浮点数转换为整数

    我试图定义 square Integer gt Integer square round 2 我得到
  • XDebug:Windows + Docker + PHPStorm

    我的操作系统是 Windows 10 我通过 boot2docker 映像运行 Docker 我使用的IDE是PHPStorm 我想做的是使用 XDebug 进行调试 但我没有让它运行 我搜索了网络并尝试了我找到的示例 但没有任何帮助 有相
  • 我收到来自 Retrofit Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $ 的响应错误

    我看了几个答案 我遗漏了一些东西 还有没有办法在 Retrofit 处理之前查看数据 这是代码 extends Activity implements Callback
  • Celery 任务状态取决于 CELERY_TASK_RESULT_EXPIRES

    据我所知 任务状态完全取决于 CELERY TASK RESULT EXPIRES 设置的值 如果我在任务完成执行后检查此间隔内的任务状态 则返回的状态为 AsyncResult task id state 是正确的 如果没有 状态将不会更
  • 在 C - linux 中强制使用原始串行模式

    不知道如何表述标题 但我想做的是用我的 Linux PC 测试我的微控制器 以确保数据正确 经过几个小时的搜索 我发现 stty 命令可以更改通过串行端口管理数据的方式 并且事实证明 默认情况下 如果从端口接收到 xon 或 xoff 字符
  • Spring集成流程的优雅关闭

    我从 spring 集成监控示例中了解到https github com spring projects spring integration samples tree master intermediate monitoring http
  • 有没有一种方法可以捕获异常而无需创建变量?

    在 PHP 中 我有时会使用 try catch 捕获一些异常 try catch Exception e Nothing this is a test that an exception is thrown 通过这种代码 我最终得到了变量
  • 修改存储在变量中的innerHTML不起作用

    我想将页面的显示区域存储在变量中 display在代码中 即innerHTMLdisplaydiv 在我的示例中 但是当我这样做时 我根本无法修改其内容 function stored var display document getEle
  • TEdit 中的 CapsLock 密码消息在视觉上因 VCL 样式而失败

    使用 VCL 样式时 在 TEdit 中使用密码时的 CapsLock 消息会出现错误 这是没有样式的样子 VCL 样式打开 该消息是葡萄牙语的 但我认为这不重要 在 Delphi Seattle 23 0 21418 4207 带有更新
  • 为什么Python中'=='出现在'in'之前? [复制]

    这个问题在这里已经有答案了 下面的代码输出 False 而根据 Python 操作顺序 它应该输出 True 顺序应该是 gt 而不是相反 为什么 出现在 in 之前 y 33 3 in y True Output False 现有的答案提
  • 比较两个字符串是否相等的超级快速方法

    显然 在Python中检查两个字符串是否相等你可以这样做 hello word hello world 但是 如果您要比较很长的字符串 超过 100 万个字符 怎么办 python 中是否有内置方法或任何库可以更快地完成此操作 也许利用卡普
  • 过滤器有问题

    我有课程搜索一切正常 除了 当 r gt price它返回所有课程 而不是最后搜索的课程 我需要捕获最后一个 时间 然后按它过滤价格 我怎样才能做到这一点 courses Course when r gt mainCat function
  • 用户订单(买入/卖出)的股票期权价格变化

    继这个问题生成虚构的股票期权价格变化 https stackoverflow com questions 9353938 generate a fictitious stock option price variation 我希望模拟价格变
  • MySQL 命令行中的 Unicode 转义序列

    简洁版本 可以使用哪种转义序列在命令行 mysql 中搜索 unicode 字符 长版 我正在寻找一种方法 从命令行在 mysql 中搜索包含 unicode 序列 U 200B 的记录的列 我不知道该使用哪种逃避方式 我已经尝试过并且x2
  • 让表示层(JSF)处理来自服务层(EJB)的业务异常

    更新提供的实体的 EJB 方法 使用 CMT Override SuppressWarnings unchecked public boolean update Entity entity throws OptimisticLockExce