gpt4 book ai didi

java - 创建自定义 log4j Appender 时出错

转载 作者:行者123 更新时间:2023-11-29 05:22:44 27 4
gpt4 key购买 nike

我正在尝试创建一个自定义 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: 类 com.foobar.logging.LogManager$Proxy$_$$_Weld$Proxy$ 覆盖 final方法 getName.()Ljava/lang/String;

如何使用 CDI 将我的 EntityManager 注入(inject)到 AppenderSkeleton 中?有没有人使用 CDI 在 AppenderSkeleton 中完成 JPA 持久化?

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

最佳答案

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

但是,我不得不质疑尝试将附加程序作为 EJB 的想法。你如何实例化它?

关于java - 创建自定义 log4j Appender 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24020916/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com