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 ?

182voto

dawrutowicz Points 2840

Merci, mais ce n'était pas la solution. J'ai trouvé pourquoi cela ne fonctionnait pas pour moi.

Depuis que j'ai fait une déclaration :

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

Je pensais faire référence au répertoire racine du projet lorsque le fichier beans.xml s'y trouvait. J'ai ensuite placé le fichier de configuration dans src/main/resources et j'ai modifié l'initialisation en :

ApplicationContext context = new ClassPathXmlApplicationContext("src/main/resources/beans.xml");

il s'agit toujours d'une exception IO.

Ensuite, le fichier a été laissé dans src/main/resources/ mais j'ai changé la déclaration en :

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

et cela a résolu le problème - peut-être que cela sera utile à quelqu'un.

Merci et bravo !

Editer :

Comme j'ai reçu de nombreuses félicitations pour cette solution et que j'ai eu ma première expérience avec Spring en tant qu'étudiant il y a quelques années, j'ai envie d'expliquer brièvement pourquoi cela fonctionne.

Lorsque le projet est compilé et empaqueté, tous les fichiers et sous-répertoires de 'src/main/java' dans le projet vont dans le répertoire racine du jar empaqueté (l'artefact que nous voulons créer). La même règle s'applique à 'src/main/resources'.

C'est une convention respectée par de nombreux outils comme maven ou sbt dans le processus de construction d'un projet (note : en tant que configuration par défaut !). Lorsque le code (du post) était en mode exécution, il ne pouvait pas trouver quelque chose comme "src/main/resources/beans.xml" en raison du fait que beans.xml était dans la racine du jar (copié à /beans.xml dans le jar/ear/war créé).

Lors de l'utilisation de ClassPathXmlApplicationContext, la déclaration d'emplacement correcte pour les définitions xml des haricots, dans ce cas, était "/beans.xml", puisque c'est le chemin auquel il appartient dans le jar et plus tard dans le classpath.

On peut le vérifier en décompressant un jar avec un archiveur (i.e. rar) et en voyant son contenu avec la structure des répertoires.

Je recommande la lecture d'articles sur le classpath en complément.

65voto

Essayez ceci :

new ClassPathXmlApplicationContext("**file:**src/main/resources/beans.xml");

fichier : Les préfixes pointent vers les ressources du système de fichiers, et non vers le chemin d'accès à la classe.

le chemin d'accès au fichier peut être relatif ou système (/home/user/Work/src...)

21voto

Kalher Points 743

J'ai également eu un problème similaire, mais pour une cause un peu différente, et je le partage ici au cas où cela pourrait aider quelqu'un.

Emplacement de mon fichier

beans.xml file

Comment j'utilisais

ClassPathXmlApplicationContext("beans.xml");

Il existe deux solutions

  1. Retirer le fichier beans.xml du paquet et le placer dans le paquet par défaut.
  2. Spécifier le nom du paquet lors de son utilisation, c'est-à-dire

ClassPathXmlApplicationContext("com/mypackage/beans.xml");

9voto

Gani Points 123

Cela est dû au fait que applicationContect.xml ou any_filename.XML n'est pas placé dans le bon chemin.

Étapes de dépannage

1 : Ajouter le fichier XML dans le dossier des ressources.

2 : Si vous n'avez pas de dossier de ressources. Créez-en un en naviguant dans nouveau par un clic droit sur le projet nouveau > Dossier source, nommez-le comme suit ressource et placez-y votre fichier XML.

8voto

OrangeDog Points 7380

src/main/resources est un répertoire source, vous ne devez pas y faire référence directement. Lorsque vous compilez/packagez le projet, le contenu sera copié au bon endroit dans votre classpath. Vous devez alors le charger comme ceci

new ClassPathXmlApplicationContext("beans.xml")

Ou comme ceci

new GenericXmlApplicationContext("classpath:beans.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