【问题标题】:Error on creating custom log4j Appender创建自定义 log4j Appender 时出错
【发布时间】:2014-06-03 17:01:51
【问题描述】:

我正在尝试创建一个自定义 Appender,它将使用 JPA 将日志持久保存到数据库中。

问题是我正在使用像这样的PersistenceContext 属性

package com.foobar.logging;

import com.foobar.model.SysLog;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.MDC;
import org.apache.log4j.spi.LoggingEvent;
import javax.ejb.Stateless;

@Stateless
public class LogManager extends AppenderSkeleton {

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

    @Override
    protected void append(LoggingEvent le) {
        SysLog log = new SysLog();
        log.setDescripcion(le.getMessage().toString());
        if (MDC.get("IdUsuario") != null) {
            log.setIdUsuario(MDC.get("IdUsuario").toString());
        }
        log.setSysAccionLog(null);

        this.em.persist(log);
    }

    @Override
    public void close() {
    }

    @Override
    public boolean requiresLayout() {
        return false;
    }

}

现在,当我将 WAR 部署到 JBoss AS 7.1 时,它失败了,并且出现错误:

java.lang.VerifyError: class com.foobar.logging.LogManager$Proxy$_$$_Weld$Proxy$ overrides final method getName.()Ljava/lang/String;

如何使用 CDI 将我的 EntityManager 注入到 AppenderSkeleton 中?有没有人使用 CDI 在 AppenderSkeleton 中实现 JPA 持久性?

我也尝试过不使用 CDI,但由于我的应用程序中的所有其他对象都使用它(JAX-RS 类),它会崩溃。

【问题讨论】:

    标签: java jpa log4j cdi


    【解决方案1】:

    EJB 是代理。 AppenderSkeleton 有一个最终的 getName 方法。我认为对于您的用例,您需要直接实现Appender。这样就避免了bean方法getName

    但是,我不得不质疑尝试将 appendar 设为 EJB 的想法。你是如何实例化它的?

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 2023-03-12
      • 1970-01-01
      • 2011-08-29
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      相关资源
      最近更新 更多