注射课时我有问题。
在我的配置中,我有一个类设置登录级别,然后一个变量用于设置级别:
<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
请帮助
答案 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 />