【问题标题】:How to disable "WARNING: javax.ejb.EJBException"如何禁用“警告:javax.ejb.EJBException”
【发布时间】:2012-08-03 11:47:04
【问题描述】:

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

这里有一些 sn-ps,backing 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,我会处理它 有了 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());
        }
    }
}

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

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

【问题讨论】:

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


    【解决方案1】:

    EJBExceptions 触发当前 JTA 事务的回滚,无论您是否捕获它们。对ProductsFacade#edit() 的调用会启动一个事务(除非将一个事务传播给它,这似乎不是这里的情况),因为它是“从外部”对 SessionBean 的调用。如果您不希望事务在这些情况下回滚,则必须在将损坏的Entity 提供给EntityManager 之前以某种方式验证用户/客户端输入。

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

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 2011-05-19
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 2020-05-21
      相关资源
      最近更新 更多