Spring引导Web - 将bean自动装配到XML定义的bean中为null

时间:2015-10-20 09:22:16

标签: spring spring-boot

我将现有的基于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

1 个答案:

答案 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);
}