1

我在注射课时遇到问题。

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

  <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);
    }

设置级别记录...

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

但现在我还有 NPE

请帮忙

4

2 回答 2

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>
于 2013-02-25T08:22:03.850 回答
0

您可以像这样使用构造函数参数:

<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 方法。

例如

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;

在 spring 上下文的顶部添加它以启用注释:

<context:annotation-config />
于 2013-02-25T09:08:10.180 回答