EJB的最佳实践

时间:2017-09-25 04:55:37

标签: java jpa java-ee transactions ejb

最近,我决定在我的项目中使用EJB。基本上,是无状态EJB,以便创建业务层并保留数据。我也使用容器管理事务(CMT),一切正常。

我尝试处理EJB服务方法中的异常,以获取更具体的异常并向客户端提供特定的错误消息。

@Stateless
public class EJBService { 

    @PersistenceContext(unitName="PU")
    private EntityManager em;

    public void save(Animal a) throws AppException
    {
        try
        {
            em.persist(e);
        }
        catch(ConstraintViolationException ex)
        {
            throw new AppException("message");
        }
        catch(Exception ex)
        {
            throw new AppException("message 1");
        }
    } 
}

AppException扩展了Exception并标有注释@ApplicationException(rollback = true)

但是,在提交事务的方法之前,我无法处理异常。如果出现问题,事务不会被提交(OK),但我没有特定的异常,只有javax.ejb.EJBTransactionRolledbackException:事务回滚。尝试保持或合并后我可以使用flush方法,但它似乎不对。

所以,我已经决定不尝试处理EJB服务层中的异常,而是留下我的方法:

@Stateless
public class EJBService { 

    @PersistenceContext(unitName="PU")
    private EntityManager em;

    public void save(Animal a) 
    {
        em.persist(a);
    }

和客户端(例如,托管bean),如下所示:

    @Named
    @RequestScoped
    public class Bean {

        private Animal animal;
        @Inject
        private EJBService service;

        public void save() {
            try
            {
                service.save(animal);
            }
            catch(Exception e)
            {
                //Unwrapping the exception in order to pass the 
                //appropriate message      
            }
        }
    }

为了显示正确的消息,调用ejb服务的方法必须自己处理异常,解开异常。

问题是:我是对的吗?如果我不是,处理异常的最佳方法是什么?

0 个答案:

没有答案