【发布时间】:2011-11-03 14:45:25
【问题描述】:
我有一个 Web 服务(使用 jaxb/jaxws 构建),它调用无状态 EJB 以在数据库中存储一些数据。数据被存储为实体 bean。实体 bean 具有通过 @Column(unique = true) 注释应用到它的唯一约束。
当 Web 服务尝试保存数据时,事务会失败,这是理所当然的。问题是,因为我使用的是 CMP,所以直到调用无状态 EJB 之后才会提交事务。最终结果是我无法捕获异常,它被汇集到 WS 堆栈并导致包含字符串的模棱两可的错误:Error committing transaction:;nested exception is: weblogic.transaction.internal.AppSetRollbackOnlyException。
有没有办法捕捉抛出的异常,以便我可以向调用者提供更多信息?谢谢。
版本信息:
- 应用服务器:Oracle Weblogic 10.3
- 持久性提供程序:Hibernate 3.2.5.ga (JPA 1.0)
- JDK/JRE:1.6_0_05(由 Weblogic 安装提供)
更新: 我试图围绕方法调用实现一个 EJB 3 拦截器,但这似乎不起作用。
public class TestInterceptor {
@AroundInvoke
public Object logCall(InvocationContext context) throws Exception {
System.out.println("Invoking method: " + context.getMethod().getName());
try {
return context.proceed();
} catch (Throwable t) {
System.out.println("I caught an exception: " + t.getMessage());
throw new Exception(t);
}
}
我认为这不起作用的原因是因为处理链使得实际持久化发生在方法之外(当然)。
【问题讨论】: