Я пытаюсь создать пользовательский 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? Кто-нибудь выполнил сопротивление JPA в AppenderSkeleton, используя CDI?
Я также пытался не использовать CDI, но поскольку каждый другой объект в моем приложении использует его (классы JAX-RS), он обрушивается.
EJB - это прокси. AppenderSkeleton
есть метод getName
который является окончательным. Я думаю, что для вашего случая использования вам необходимо реализовать Appender
напрямую. Это позволит избежать метода bean getName
Тем не менее, я должен задать вопрос о попытке сделать appendar EJB. Как вы его создаете?