我有一个 EJB3 应用程序,其中包含一些用于访问数据库的 EJB,并通过 session Bean 作为 Web 服务公开。
现在我需要弄清楚两件事:
1) 有什么方法可以阻止 SQL 异常导致 Web 服务抛出 SOAP 错误吗?事务由容器处理,当前 sql 异常会导致抛出 RollBackException,从而导致事务回滚(期望的行为)并且 Web 服务抛出错误(不期望的行为)。
2) 我希望扩展 Web 服务,使其能够接收实体列表,并使用 session bean 来保存每个实体。但是,我希望每个实体都在自己的事务中执行,这样如果一个实体失败,其他实体就不会受到影响(并且 Web 服务不应出现故障)。
对于 (1),我 try catch RollBackException,但我假设这是在另一个线程的某个地方抛出的,因为永远不会到达 catch block 。我假设对于(2)我需要研究用户事务,但首先更喜欢容器来管理它,其次不知道如何强制使用用户事务。
谢谢。
最佳答案
不,您可以使用容器管理的事务来完成所有这些(这绝对是更好的选择,因为管理事务很痛苦)。
该解决方案的要点是创建第二个仅具有本地接口(interface)和您想要的事务语义的 EJB。然后,Web 服务直接调用的“公共(public)”ejb 通过其本地接口(interface)调用第二个 ejb 来完成实际工作。
大致如下:
public class MyPublicEjb {
@EJB
private MyPrivateImpl impl;
public void doSomething() {
try {
impl.doSomething();
} catch(TXRolledBack) {
// handle rollback ...
}
}
}
我知道这看起来有点难看,但相信我,这比直接操纵交易要好得多。
关于java - EJB3 - 处理 RollBackException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/673538/