【问题标题】:Java EE 6 Producer Not Working [duplicate]Java EE 6 Producer 不工作 [重复]
【发布时间】:2018-02-28 02:43:39
【问题描述】:

我正在使用 JBoss As 7 和 Java EE 6。我有一个空 beans.xml

我有一个像这样的记录器生产者..

@Singleton
@Startup
public class LoggerProducer {

     private static Logger logger = Logger.getLogger(LoggerProducer.class.getName());

    @Produces
    public Logger produceLogger(final InjectionPoint injectionPoint) {  
        final String injectingClass = injectionPoint.getMember().getDeclaringClass().getName();
        return Logger.getLogger(injectingClass);  
    }  

}

在我的课堂上我注入如下...

@Inject
Logger logger;

我在每种情况下都导入 java util logger

import java.util.logging.Logger;

一切都正确部署,但是记录器的注入失败,如果我尝试使用注入的记录器,我会得到一个运行时 NullPointer

【问题讨论】:

  • ..你必须修改 log4j.xml 文件..根据你的要求
  • 嗨@idiotduffer,谢谢你的回复。我没有使用 log4j,但我使用的是 java util 日志记录。这使用 /standalone/configuration/logging.properties 中自动生成的 logging.properties 文件
  • 您的 beans.xml 是否在正确的位置?您有 WAR 或 EAR 文件吗?你还注入其他有效的对象吗?

标签: jakarta-ee nullpointerexception cdi inject


【解决方案1】:

感谢大家的回复。

我将 beans.xml 放在正确的位置 (WEB-INF)。它被打包为 .war。

问题是我自己在将记录器注入的类(bean)中的编码错误。我错误地使用了constructor 来初始化类,因此在 CDI 有机会注入之前尝试使用记录器

修复方法是用@PostConstruct 方法替换构造函数,并且一切正常。

@MyAnnotation
@Singleton
public class MtHammer implements Hammer {

    .....

    @Inject
    Logger logger2;


    @PostConstruct
    private void startup() {

        initialise();

    }

     private void initialise() {
            logger.info("logger...Initialising ...");
      ....
        }

【讨论】:

  • ..将 bean.xml 放在 META-INF 文件夹中,war 文件应该在 META-INF 中,EAR 文件应该在 WEB-INF 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 2011-10-15
  • 2011-07-29
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
相关资源
最近更新 更多