2015-10-20 4 views
1

Je convertis mon application web Spring 3.1 existante en Spring Boot 1.2.5. J'ai initialement mis à jour mon ancienne application vers Spring 4.1.7.Spring boot web - Le bean Autowire dans un bean XML défini est null

L'ancienne application contient de nombreux fichiers de configuration de beans xml importés en utilisant le paramètre d'initialisation contextConfigLocation dans le web.xml. Dans la nouvelle application de démarrage Spring ces xml sont importés en utilisant @ImportResource dans la classe principale. Lorsque j'ai démarré mon application, j'ai pu voir que les beans basés sur xml sont créés avec des champs auto-émis null. Lorsque je débogue la partie de création de bean, il semble que le AutowiredAnnotationBeanPostProcessor n'est pas encore ajouté au beanfactory. Mais XML contient <context:annotation-config />, ce qui suppose d'ajouter le AutowiredAnnotationBeanPostProcessor. De plus, ce post-processeur est ajouté juste après la création de mes beans basés sur xml.

La plupart des dépendances au bean sont des beans auto-gérés dans le bean défini en xml.

exemple config 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 classe Bean qui est utilisé pour créer le haricot 'discoveredResourceClasses de:

@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 haricot:

@Service 
public class ExtensionManager implements IExtensionManager { 

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

} 

printemps classe de démarrage:

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

}

Au moment de la création resourceManager de haricot, le champ extensionManager est à venir comme null. Ainsi, la méthode factory (getResourceClasses) renvoie NullPointerException.

+0

Affichez votre classe principale. Spring Boot devrait déjà enregistrer le processeur pour vous afin que vous puissiez supprimer cette ligne de votre XML. On dirait que vous faites quelque chose de mal dans votre classe principale. Veuillez également lire http://stackoverflow.com/help/how-to-ask et veuillez développer votre question. –

+0

Publiez la classe dans laquelle vous appelez cette méthode. – chrylis

+0

Mis à jour ma question avec plus d'informations. – jo1984

Répondre

0

Vous devez indiquer le chemin d'accès au fichier de configuration xml au début, lorsque Spring n'a pas démarré la construction du contexte de l'application. Les annotations @ImportResource sont traitées au milieu de ce processus, après l'enregistrement de nombreux PostProcesseurs.

Vous devez fournir un chemin d'accès à la configuration xml à l'aide de la méthode SpringApplicationBuilder.sources.

@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 

@Override 
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { 
    return builder.sources("classpath:/WEB-INF/context/payables-profile.xml", Application.class); 
}