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
.
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. –
Publiez la classe dans laquelle vous appelez cette méthode. – chrylis
Mis à jour ma question avec plus d'informations. – jo1984