我有一个EJB3应用程序,它包含一些用于访问数据库的EJB,并通过会话Bean作为Web服务公开。
现在我需要找到两件事:
1)有什么方法可以阻止SQL异常导致Web服务抛出SOAP错误?事务由容器处理,当前sql异常导致抛出RollBackException,从而导致事务回滚(所需行为),Web服务抛出错误(不需要)。
2)我希望扩展webservice以获取实体列表,并且会话bean可以保留每个实体。但是,我希望每个实体都在自己的事务中执行,这样如果一个实体失败,其他实体就不会受到影响(并且Web服务也不会出错)。
对于(1)我试图捕获RollBackException,但我认为这是在另一个线程上抛出的,因为永远不会到达catch块。我假设(2)我将需要查看用户事务,但首先更喜欢容器来管理它,其次不知道如何强制使用用户事务。
感谢。
答案 0 :(得分:2)
不,你可以用容器管理的交易完成所有这些(这绝对是可取的,因为管理交易很麻烦)。
解决方案的要点是创建仅具有本地接口的第二个EJB以及您需要的事务语义。然后你的“公共”ejb,即web服务直接调用,通过其本地接口调用第二个ejb来完成实际的工作。
类似于:
public class MyPublicEjb {
@EJB
private MyPrivateImpl impl;
public void doSomething() {
try {
impl.doSomething();
} catch(TXRolledBack) {
// handle rollback ...
}
}
}
我知道这看起来很丑陋,但相信我,这比直接操纵交易要好得多。
答案 1 :(得分:0)
对于(1):调试代码以找出抛出异常的位置以及导致异常的原因。然后在那里处理异常。
For(2):用beginTransaction()和commit()包装每个实例。
for(each Entity){
try{
//begin transaction
//save entity
//commit
} catch(Exception e) {
//handle Exception, but continue on
}
}