Spring引导web - 自动装入bean到XML定义的bean为空
我将现有基于Spring 3.1的web应用程序转换为Spring Boot 1.2.5。我最初将我的旧应用程序升级到Spring 4.1.7。Spring引导web - 自动装入bean到XML定义的bean为空
旧的应用程序具有许多使用中的初始参数contextConfigLocation
导入的xml bean配置文件。在新的Spring引导应用程序中,这些xml在主类中使用@ImportResource
导入。
当我开始我的应用程序时,我可以看到基于xml的bean使用自动布线字段null
创建。当我调试bean创建部分时,它看起来像AutowiredAnnotationBeanPostProcessor
尚未添加到beanfactory。但是xml包含<context:annotation-config />
,它假设添加AutowiredAnnotationBeanPostProcessor
。这个后处理程序在我创建基于xml的bean后立即添加。
许多bean依赖项是xml定义的bean中的autowired bean。
示例XML配置:
<context:annotation-config/>
<context:component-scan base-package="x.y.z"/>
<bean id="discoveredResourceClasses" factory-bean="resourceManager" factory-method="getResourceClasses">
<constructor-arg>
<list>
<value>x.y.z.resources</value>
</list>
</constructor-arg>
</bean>
这是用来创建 'discoveredResourceClasses' 豆
Factotry Bean类:
@Service
public class ResourceManager implements Serializable{
@Autowired
protected IExtensionManager extensionManager;
public List<Class<? extends Resource>> getResourceClasses(String ... packageNames)
{
return extensionManager.getExtensions(packageName, includeEverything, Resource.class);
}
}
自动装配Autowired豆:
@Service
public class ExtensionManager implements IExtensionManager {
public <T> List<T> getExtensions(String packageName, Map<String, String> filter, Class<T> clazz) {
//busoinesslogic .
}
}
春季启动类:
@ImportResource("classpath*:xad-config-all.xml")
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在resourceManager
bean创建的时候,现场extensionManager
即将为null
。所以工厂方法(getResourceClasses)抛出NullPointerException
。
当Spring没有开始构建应用程序上下文时,您需要在开始时提供xml配置文件的路径。在许多PostProcessors被注册之后,@ImportResource注解在这个过程的中间被处理。
您需要使用SpringApplicationBuilder.sources方法提供xml配置的路径。
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources("classpath:/WEB-INF/context/payables-profile.xml", Application.class);
}
发布您的主类。 Spring Boot应该已经为您注册处理器,以便您可以从XML中删除该行。看起来你在主班上做错了什么。另请阅读http://stackoverflow.com/help/how-to-ask并请扩展您的问题。 –
发布您要调用该方法的类。 – chrylis
用更多信息更新了我的问题。 – jo1984