2015-10-20 92 views
1

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

+0

发布您的主类。 Spring Boot应该已经为您注册处理器,以便您可以从XML中删除该行。看起来你在主班上做错了什么。另请阅读http://stackoverflow.com/help/how-to-ask并请扩展您的问题。 –

+0

发布您要调用该方法的类。 – chrylis

+0

用更多信息更新了我的问题。 – jo1984

回答

0

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