我将现有的基于Spring 3.1的Web应用程序转换为Spring Boot 1.2.5。我最初将旧的应用程序升级到Spring 4.1.7。
旧应用程序在contextConfigLocation
中使用init参数web.xml
导入了许多xml bean配置文件。在新的Spring启动应用程序中,这些xml是使用主类中的@ImportResource
导入的。
当我启动应用程序时,我可以看到基于xml的bean是使用自动连接的字段null
创建的。当我调试bean创建部分时,看起来AutowiredAnnotationBeanPostProcessor
尚未添加到beanfactory中。但是xml包含<context:annotation-config />
,假设要添加AutowiredAnnotationBeanPostProcessor
。此后发布处理器也是在创建基于xml的bean之后添加的。
许多bean依赖项都是xml定义bean中的自动装配bean。
示例xml config:
<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>
Factotry Bean类,用于创建'discoveredResourceClasses'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 bean:
@Service
public class ExtensionManager implements IExtensionManager {
public <T> List<T> getExtensions(String packageName, Map<String, String> filter, Class<T> clazz) {
//busoinesslogic .
}
}
Spring boot class:
@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
的形式出现。因此,factory-method(getResourceClasses)抛出NullPointerException
。
答案 0 :(得分:0)
当Spring没有开始构建应用程序上下文时,您需要在开始时提供xml配置文件的路径。在注册了许多PostProcessor之后,@ InmportResource注释在此过程的中间进行处理。
您需要使用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);
}