相关疑难解决方法(0)

EJB容器中的@ApplicationException(rollback = true)与RuntimeException和Exception之间的区别

account在JSF bean中调用EJB方法:

try{
   account.someFunction(...);
}catch(SimRuntimeException e){
   logger.log(Level.FATAL, "SimRuntimeException catched !");
}catch(SimNotRuntimeException e){
   logger.log(Level.FATAL, "SimNotRuntimeException catched !");
}catch(Exception e){
   logger.log(Level.FATAL, "Exception catched !");
}
Run Code Online (Sandbox Code Playgroud)

我的例外情况:

public class SimRuntimeException extends RuntimeException {

   public SimRuntimeException() {
      super();
   }

}



@ApplicationException(rollback=true)
public class SimNotRuntimeException extends Exception {

   public SimNotRuntimeException() {
      super();  
   }


}
Run Code Online (Sandbox Code Playgroud)
  • account.someFunction(...);抛出SimRuntimeException我陷入Exception块,因为我SimRuntimeException被包裹成EJBException可能是由EJB容器.
  • account.someFunction(...);抛出SimNotRuntimeException我属于预期成SimNotRuntimeException

那么,是什么具体的区别Exception@ApplicationException(rollback=true)RuntimeException好吗?

java ejb runtimeexception

5
推荐指数
1
解决办法
5956
查看次数

在托管bean中回滚事务

我想回滚事务不是在EJB内部而是在JSF托管bean内部.在EJB内部我们可以使用SessionContext.setRollBackOnly()但是我可以在托管bean中使用什么?

@Stateless
@Local(AccountLocal.class)
public class AccountBean implements AccountLocal {

   public void test1() throws CustomException(){
      ...
   } 

   public void test2() throws CustomException(){
      ...
      throw new CustomException();
   }   

   public void test3() throws CustomException(){
      ...
   }

   public void all() throws CustomException(){
       test1();
       test2();
       test3();
   } 

}
Run Code Online (Sandbox Code Playgroud)

在我的托管bean中:

@SessionScoped
public class LoginBean implements Serializable{

   public void test(){

      try{
         accountBean.test1();
         accountBean.test2();
         accountBean.test3();
      }catch(CustomException e){
         // WHAT HERE TO ROLLBACK TRANSACTION ?
      }      
    }    
}
Run Code Online (Sandbox Code Playgroud)

编辑:我怎么能保证的是,如果一个test1,test2test3回滚,其他人将回滚呢?

我测试了这段代码, …

jsf ejb transactions

3
推荐指数
1
解决办法
2780
查看次数

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

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

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

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

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

但这样做会使javax.persistence表达层上的API 产生额外的依赖性,这是一种导致紧密耦合的设计气味.

应该包装哪个例外,以便完全省略紧耦合问题?或者是否有一种标准方法来处理此异常,这反过来又不会导致在表示层上强制执行任何服务层依赖性?

顺便说一句,我发现在EJB中(在服务层本身上)捕获此异常然后向客户端(JSF)返回一个标志值是笨拙的.

jsf ejb exception-handling java-ee optimistic-locking

3
推荐指数
1
解决办法
1072
查看次数

JPA和EJB - 我什么时候需要使用事务?

我正在学习一些教程后的Java持久性.

我正在使用Java EE 7和Payara服务器.

我注意到每个使用不同的持久性方法.

例子:

  • 简单

    @Stateless
    public class BookServiceBean implements BookService {
        @PersistenceContext
        private EntityManager em;
    
        public void createOrUpdate(Book book) {
            em.persist(book);
        }
        public void remove(Book book) {
            em.remove(book);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • with flush(),这是在persistene.xml中的 "AUTO"上没有设置验证策略时使用的,对吧?

    @Stateless
    public class BookServiceBean implements BookService {
        @PersistenceContext
        private EntityManager em;
    
        public void createOrUpdate(Book book) {
            em.persist(book);
            em.flush();
        }
        public void remove(Book book) {
            em.remove(book);
            em.flush();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 与交易

    @Stateless
    public class BookServiceBean implements BookService {
        @PersistenceContext
        private EntityManager em;
    
        public void …
    Run Code Online (Sandbox Code Playgroud)

ejb jpa transactions jta java-ee

2
推荐指数
1
解决办法
1579
查看次数

为什么抛出 EJBException 而不是 NoResulException?

我不知道为什么我无法捕获 EJB 中的方法抛出的 NoResultException ......

try {
    User user = userFacade.findByEmail(email);
    userController.setSelected(user);
    getSelected().setUserOid(user.getOid());
} catch (NoResultException noResultException) {
    JsfUtil.addErrorMessage("No user found with provided email");
    System.err.println(noResultException.getMessage());
} catch (EJBException e){
    System.err.println(e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)

EJB

@Stateless
public class UserFacade extends AbstractFacade<User> {

    ...

    public User findByEmail (String email) throws NoResultException{
        User user = em.createNamedQuery("User.findByEmail", User.class).
                setParameter("email", email).getSingleResult();
        return user;
    }

    ...
Run Code Online (Sandbox Code Playgroud)

为什么这段代码会捕获 EJBException 而不是 NoResultException 以及如何捕获 NoResultException?

Avvertenza:   javax.ejb.EJBException
...
...
Caused by: javax.persistence.NoResultException: getSingleResult() did not retrieve any entities.
Run Code Online (Sandbox Code Playgroud)

jsf ejb exception-handling jakarta-ee

1
推荐指数
1
解决办法
1019
查看次数