最近,我决定在我的项目中使用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服务的方法必须自己处理异常,解开异常。
问题是:我是对的吗?如果我不是,处理异常的最佳方法是什么?