首页 文章

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

提问于
浏览
1

我将现有的基于Spring 3.1的Web应用程序转换为Spring Boot 1.2.5 . 我最初将旧的应用程序升级到Spring 4.1.7 .

旧应用程序在 web.xml 中使用init参数 contextConfigLocation 导入了许多xml bean配置文件 . 在新的Spring启动应用程序中,这些xml是在主类中使用 @ImportResource 导入的 .

当我启动我的应用程序时,我可以看到基于xml的bean是使用自动连接的字段 null 创建的 . 当我调试bean创建部分时,看起来 AutowiredAnnotationBeanPostProcessor 尚未添加到beanfactory中 . 但是xml包含 <context:annotation-config /> ,它假设添加 AutowiredAnnotationBeanPostProcessor . 在创建基于xml的bean之后立即添加此post处理器 .

许多bean依赖项是xml定义bean中的自动装配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>

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

自动 beans :

@Service
public class ExtensionManager implements IExtensionManager {

    public <T> List<T> getExtensions(String packageName, Map<String, String> filter, Class<T> clazz) {
        //busoinesslogic .
    }

}

Spring引导类:

@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

    当Spring没有开始构建应用程序上下文时,您需要在开始时提供xml配置文件的路径 . 在注册了许多PostProcessor之后,在此过程的中间处理@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);
    }
    

相关问题