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

时间:2012-08-06 13:38:16

标签: jsf java-ee jsf-2 glassfish-3 ejb-3.1

我正在尝试使用以下组件开始使用简单的java ee应用程序:JSF 2.0,JPA EclipseLink,Glasshfish 3.

以下是一些片段,支持bean:

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

ProductsFacade:

@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,我处理它 有了catch,所以saveRow支持bean方法现在看起来不那么简洁:

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());
        }
    }
}

仍然玻璃鱼日志充满了“警告:javax.ejb.EJBException”和长痕迹。 我有一些问题:

  1. 我的设置有多正确?我知道jsf应该处理BeanValidation,但它不是我的情况。
  2. 如何禁用EJBException警告,以免服务器日志被污染
  3. 有更好的方法来处理EjbException吗?

1 个答案:

答案 0 :(得分:1)

无论您是否捕获它们,

EJBException都会触发当前JTA事务的回滚。对ProductsFacade#edit()的调用启动一个事务(除非一个传播到它,这似乎不是这种情况),因为它是一个“从外部”到SessionBean的调用。如果您不希望事务在这些方案中回滚,则必须先将用户/客户端输入以某种方式验证,然后再将Entity分配给EntityManager

这里有几个怪癖和事情可以避免这种情况。例如,您可以拥有ProductsFacade句柄事务:@TransactionManagement(TransactionManagementType.BEAN),这将占用使用EJB的重要部分。我确实认为这种默认行为是应该的。如果您不希望在日志中使用回滚,则可以配置日志记录级别/等等 - 但我确实认为EJB分层事务回滚属于日志,它在开发过程中确实存在。