我有这些豆子:
<bean id="Child" class="test.Child"></bean>
<bean id="Parent" class="test.Parent">
<property name="child" ref="Child" />
</bean>
我在Tomcat上使用Axis2,Spring和Hibernate。 Axis服务位于Parent bean中。它在services.xml中映射为SpringBeanName,包括正确的ServiceClass。我将日志放在Parent bean中的Child bean变量的get和set方法中:
private Child child;
public void setChild(Child child) {
this.child = child;
System.out.println(child);
}
public Child getChild() {
System.out.println(child);
return child;
}
我在启动时调用了一个Spring初始化服务,用于在实现ServiceLifeCycle的服务中的startUp方法中加载Spring。
ClassLoader classLoader = service.getClassLoader();
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
new String[] { "classpath:spring/applicationContext.xml" }, false);
applicationContext.setClassLoader(classLoader);
applicationContext.refresh();
这是一个简单的示例项目,因为逻辑实际上要复杂得多。无论如何,结果是:
问题是当Tomcat重新启动时。在起始日志中,使用非null对象调用set方法。但是当调用服务时 - Null Pointer Exception,child为null。重新部署AAR会使一切恢复正常。但是在重新启动之后 - 孩子再次为空。
发生了什么事?我们将不胜感激。
注意:我不会使用new创建子项。 bean的所有范围都是默认的。我尝试使用原型范围但没有成功。会话和请求范围引发了一个例外,即这些范围无法识别:
没有范围注册范围'...'
注意2:取消注释conf文件夹中context.xml中的标记没有改变任何内容。我在更改后重新启动了Tomcat。
答案 0 :(得分:0)
我找到了一个解决方案,但它并未涵盖所有情况。将services.xml
中的服务范围从application
更改为request
(或其他两个)可以解决似乎有点合乎逻辑的问题。
注意:如果application
范围是您真正需要的,则此修复程序不适用。