Tomcat使用Spring和Axis2重新启动后,注入的bean为null

时间:2014-02-07 16:57:37

标签: java spring hibernate tomcat axis2

我有这些豆子:

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

这是一个简单的示例项目,因为逻辑实际上要复杂得多。无论如何,结果是:

  • 在Axis2 war分发服务中部署AAR,一切都加载完美,实际上使用非null对象调用set方法。
  • 每次调用服务时,都会成功阅读子项。

问题是当Tomcat重新启动时。在起始日志中,使用非null对象调用set方法。但是当调用服务时 - Null Pointer Exception,child为null。重新部署AAR会使一切恢复正常。但是在重新启动之后 - 孩子再次为空。

发生了什么事?我们将不胜感激。

  • 注意:我不会使用new创建子项。 bean的所有范围都是默认的。我尝试使用原型范围但没有成功。会话和请求范围引发了一个例外,即这些范围无法识别:

    没有范围注册范围'...'

  • 注意2:取消注释conf文件夹中context.xml中的标记没有改变任何内容。我在更改后重新启动了Tomcat。

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,但它并未涵盖所有情况。将services.xml中的服务范围从application更改为request(或其他两个)可以解决似乎有点合乎逻辑的问题。

注意:如果application范围是您真正需要的,则此修复程序不适用。