代码之家  ›  专栏  ›  技术社区  ›  Dfr

如何禁用“警告:javax.ejb.EJBException”

  •  2
  • Dfr  · 技术社区  · 12 年前

    我试图开始使用简单的javaee应用程序,使用以下组件:JSF 2.0、JPA EclipseLink、Glasshfish 3。

    下面是一些支持bean的片段:

    @Inject
    private ProductsFacade model;    
    public void saveRow(Products p) {
            model.edit(p);
    }
    

    产品学院:

    @Stateless
    public class ProductsFacade extends AbstractFacade<Products> {
        @PersistenceContext
        private EntityManager em;
        public void edit(Products entity) {
            em.merge(entity);
        }
        ....
    

    Products是一个带有bean验证注释的实体bean。

    现在,当用户填写表单不正确时,“model.edit”抛出EjbException,我会处理它 有了捕获,所以 saveRow backingbean方法现在看起来不那么简洁:

    public void saveRow(Products p) {
        try {
            model.edit(p);
        } catch (EJBException e) {
            if(e.getCause().getClass().getName().equals("javax.validation.ConstraintViolationException")) {
                handleConstraintViolation((ConstraintViolationException)e.getCause());
            }
        }
    }
    

    仍然是glassfish日志,其中充满了“WARNING:javax.ejb.EJBException”和长跟踪。 我有一些问题:

    1. 我的设置有多正确?我知道jsf应该处理BeanValidation,但在我的情况下没有。
    2. 如何禁用 EJBException 警告,这样服务器日志就不会被污染
    3. 有没有更好的方法来处理EjbException?
    1 回复  |  直到 12 年前
        1
  •  1
  •   esej    12 年前

    EJBException s触发当前JTA事务的回滚,无论您是否捕获它们。对的呼叫 ProductsFacade#edit() 启动一个事务(除非一个事务被传播到它,这里似乎不是这样),因为它是对SessionBean的“外部”调用。如果您不希望事务在这些场景中回滚,那么在给出损坏的消息之前,您必须以某种方式验证用户/客户端输入 Entity EntityManager

    为了避免这种情况,这里有几个怪癖和需要做的事情。例如,您可以 ProductsFacade 处理事务: @TransactionManagement(TransactionManagementType.BEAN) 但是,这将剥夺使用EJB的大部分意义。我确实认为这种默认行为是应该的。如果你不想在日志中进行回滚,你可以配置日志级别等-但我确实认为EJB分层事务回滚属于日志,它在开发过程中肯定会这样做。