83 votes

Spring ne trouve pas le fichier de configuration xml du bean alors qu'il existe.

J'essaie de créer mon premier bean en Spring mais j'ai un problème avec le chargement d'un contexte. J'ai un fichier XML de configuration du bean dans src/main/resources.

Je reçois l'exception IO suivante :

Exception dans le thread "main" org.springframework.beans.factory.BeanDefinitionStoreException : IOException lors de l'analyse du document XML à partir de la ressource du chemin de classe [src/main/resources/beans.xml] ; l'exception imbriquée est la suivante

java.io.FileNotFoundException : le chemin d'accès à la ressource [src/main/resources/beans.xml] ne peut pas être ouvert. être ouverte car elle n'existe pas

mais je ne comprends pas, puisque je fais le test de code suivant :

File f = new File("src/main/resources/beans.xml");
System.out.println("Exist test: " + f.exists());

ce qui me donne raison ! resources se trouve dans le chemin d'accès (classpath). Qu'est-ce qui ne va pas ?

5voto

Deep Shah Points 113

L'utiliser ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");

3voto

Brian Agnew Points 143181

Je soupçonne que vous construisez un .war/.jar et que, par conséquent, il ne s'agit plus d'un fichier, mais d'une ressource à l'intérieur de ce paquet. Essayez ClassLoader.getResourceAsStream(String path) au lieu de cela.

3voto

Michael Z Points 626

Vous avez consulté le répertoire src. Le fichier xml y existe effectivement. Mais regardez dans le répertoire class ou bin/build où toutes vos classes de sortie sont définies. Je pense que vous n'aurez besoin que du chemin resources/beans.xml pour l'utiliser.

3voto

Kanagavelu Sugumar Points 1206

Notez que le premier applicationContext est chargé dans le cadre de l'application web.xml qui est mentionnée ci-dessous.

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>META-INF/spring/applicationContext.xml</param-value>
</context-param>

<servlet>
    <servlet-name>myOwn-controller</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>META-INF/spring/applicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

Le code ci-dessous tente également de créer un autre applicationContext.

private static final ApplicationContext context = 
               new ClassPathXmlApplicationContext("beans.xml");

Voir le différence entre beans.xml y applicationContext.xml

Et si appliationContext.xml sous <META-INF/spring/> a déclaré avec <import resource="beans.xml"/> alors ceci appliationContext.xml est en train de charger le beans.xml au même endroit META-INF/spring de appliationContext.xml .

Dans le code, s'il est déclaré comme suit

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

Il s'agit de consulter le fichier beans.xml à l'adresse suivante WEB-INF/classes OU en éclipse src/main/resources .

[Si vous avez ajouté beans.xml en src/main/resources il peut alors être placé à WEB-INF/classes tout en créant le WAR].

Tout à fait DEUX sont recherchés.

J'ai résolu ce problème en ajoutant la recherche du chemin d'accès (classpath) lors de l'importation à applicationContext.xml comme ci-dessous

<import resource="classpath*:beans.xml" />

et supprimé la ligne ClassPathXmlApplicationContext("beans.xml") dans le code Java, afin qu'il n'y ait qu'un seul ApplicationContext chargé.

2voto

Shashesh Points 81

Dans Spring, tous les fichiers sources se trouvent dans src/main/java. De même, les ressources sont généralement conservées dans src/main/resources. Conservez donc votre fichier de configuration Spring dans le dossier resources.

Assurez-vous que l'entrée ClassPath de vos fichiers se trouve également dans src/main/resources.

Dans .classpath vérifiez les 2 lignes suivantes. Si elles sont manquantes, ajoutez-les.

<classpathentry path="src/main/java" kind="src"/>
<classpathentry path="src/main/resources" kind="src" />

Donc, si vous avez tout ce qu'il faut, le code ci-dessous devrait fonctionner.

ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring-Module.xml") ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X