NPE在春季注射类

时间:2013-02-25 08:19:11

标签: java spring

注射课时我有问题。

在我的配置中,我有一个类设置登录级别,然后一个变量用于设置级别:

  <bean id="config" class="..." init-method="init">   
        <property name="log4jConfig" ref="log4j" />
        <property name="levelLogging" value="9" />
    </bean>

和代码:

public void setlevelLogging(Integer level) {

    if (level == null) {
        set0();
    } else {
        switch (level) {
        case 0:
            set0();
            break;
        case 9:
            set9();
        }
    }
    this.level = level;

}

private void set0() {
    log4jConfig.setLoggerLevel("org.springframework.ws.server.MessageTracing", "OFF");
    log4jConfig.setLoggerLevel("org.app", "INFO");
    log4jConfig.setLoggerLevel("org.springframework.ws.client.MessageTracing", "OFF");
}    

public void setLog4jConfig(Log4jConfigJmx log4jConfig) {
    this.log4jConfig = log4jConfig;
}

当我想运行这段代码时,我得到了NPE,因为当setlevelLogging调用时,log4jConfig为空。

我如何解决此异常?

现在我从属性中排除了这个类,并在configClass中创建了新类:

Log4jConfigJmx log4jConfig = new Log4jConfigJmx()

但我不认为这是个好主意

编辑:

我尝试下面的例子,但我还有一些问题:

首先我得到了这个例外:

[ERROR] java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given

因为我使用的是事务性和AOP所以我将默认构造函数添加到类中,所以我有两个:

    public Config() {
    }

    public Config(Log4jConfigJmx log4jConfig, Integer level) {
this.log4jConfig = log4jConfig;
setlevelLoggin(level);
    }

setlevelLogging ...

 <bean id="config" class="..." init-method="init">   
      <constructor-arg index="0" ref="log4j" />
      <constructor-arg index="1" value="9" />
 </bean>

但现在我还有NPE

请帮助

2 个答案:

答案 0 :(得分:1)

您应该将方法setLoggingLevel中的代码放在init方法中。

只留下this.level = level,这是一个简单的设定者。

在设置了所有属性后调用init方法。

----评论后编辑----

发表评论后,我建议您使用构造函数:

public Class(Integer level, Log4jConfigJmx log4jConfig){
   this.log4jConfig = log4jConfig;
   setLevelLogging(level);
}

<bean id="config" class="..." init-method="init"> 
   <constructor-arg index="0" value="9"/>
   <constructor-arg index="1" ref="log4j"/>
</bean>

答案 1 :(得分:0)

你可以使用这样的构造函数args:

<bean id="config" class="..." init-method="init">   
    <constructor-arg><ref bean="anotherExampleBean"/></constructor-arg>
    <constructor-arg type="int"><value>9</value></constructor-arg>
</bean>

然后你的构造函数可以初始化两个变量,同时保持你的setter方法。

E.g。

public MyClass(Log4jConfigJmx log4jConfig, Integer level) {
    this.log4jConfig = log4jConfig;
    this.setLevelLogging(level);
}

您也可以尝试制作log4jConfig autowired

将您的bean配置更改回:

<bean id="config" class="..." init-method="init">   
    <property name="levelLogging" value="9" />
</bean>

然后只需在您的班级中注释一个要自动装配的字段:

@Autowired
private Log4jConfigJmx log4jConfig;

在弹簧上下文的顶部添加此项以启用注释:

<context:annotation-config />