Spring ne peut pas trouver le fichier de configuration xml bean lorsqu’il existe

J’essaie de faire mon premier haricot au spring mais j’ai un problème avec le chargement d’un contexte. J’ai un fichier de configuration XML du bean dans src / main / resources.

Je reçois les exceptions IOException suivantes:

Exception dans le thread “main” org.springframework.beans.factory.BeanDefinitionStoreException: IOException analysant un document XML à partir de la ressource de chemin de classe [src / main / resources / beans.xml]; l’exception nestede est

java.io.FileNotFoundException: la ressource de chemin de classe [src / main / resources / beans.xml] ne peut pas ê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 sont dans le classpath. Qu’est-ce qui ne va pas?

Merci, mais ce n’était pas la solution. Je l’ai découvert pourquoi cela ne fonctionnait pas pour moi.

Depuis que j’ai fait une déclaration:

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

Je pensais que je ferais référence au répertoire racine du projet lorsque le fichier beans.xml était là. Ensuite, je mets le fichier de configuration sur src / main / resources et change d’initialisation pour:

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

c’était toujours une exception IO.

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

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

et cela a résolu le problème – ce sera peut-être utile pour quelqu’un.

merci et bravo!

Modifier:

Étant donné que de nombreuses personnes ont acquiescé à la solution et ont eu la première expérience de Spring en tant qu’étudiant il ya 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 fichier 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 en cours de construction de projet (remarque: comme configuration par défaut!). Lorsque le code (depuis la publication) était en mode d’exécution, il ne pouvait rien trouver comme “src / main / resources / beans.xml” car beans.xml était dans la racine de jar (copié dans / beans .xml dans le fichier jar / ear / war).

Lorsque vous utilisez ClassPathXmlApplicationContext, la déclaration d’emplacement appropriée pour les définitions XML de beans, dans ce cas, était “/beans.xml”, car il s’agit du chemin d’access dans jar et plus tard dans classpath.

Cela peut être vérifié en décompactant un fichier jar avec un archiveur (c.-à-d. Rar) et voir son contenu avec la structure des répertoires.

Je recommanderais de lire des articles sur classpath comme supplémentaire.

Essaye ça:

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

file: preffix pointe vers les ressources du système de fichiers, pas classpath.

le chemin du fichier peut être relatif ou système (/ home / utilisateur / Work / src …)

J’ai aussi eu un problème similaire, mais à cause d’une cause un peu différente, alors je partage ici au cas où cela pourrait aider quelqu’un.

Mon emplacement de fichier

Fichier beans.xml

Comment j’utilisais

ClassPathXmlApplicationContext("beans.xml");

Il y a deux solutions

  1. Sortez le paquet beans.xml et mettez-le dans le paquetage par défaut.
  2. Spécifiez le nom du package lors de son utilisation, à savoir.

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

src/main/resources est un répertoire source, vous ne devez pas le référencer directement. Lorsque vous comstackz / comstackz le projet, le contenu sera copié au bon endroit pour votre chemin de classe. Vous devriez alors le charger comme ça

 new ClassPathXmlApplicationContext("beans.xml") 

Ou comme ça

 new GenericXmlApplicationContext("classpath:beans.xml"); 

utilisez le ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");

Je suppose que vous créez un fichier .war / .jar et que par conséquent, ce n’est plus un fichier, mais une ressource dans ce package. Essayez plutôt ClassLoader.getResourceAsStream (chemin de la chaîne) .

Vous avez consulté le répertoire src. Le fichier xml existe bel et bien là. Mais regardez le répertoire class ou bin / build où sont définies toutes vos classes de sortie. Je suppose que vous n’aurez besoin que du chemin ressources / beans.xml à utiliser.

Notez que le premier applicationContext est chargé dans le cadre de web.xml ; qui est mentionné avec le ci-dessous.

  contextConfigLocation META-INF/spring/applicationContext.xml   myOwn-controller org.springframework.web.servlet.DispatcherServlet  contextConfigLocation META-INF/spring/applicationContext.xml  1  

Où comme ci-dessous le code essaiera également de créer un autre applicationContext.

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

Voir la différence entre beans.xml et applicationContext.xml

Et si appliationContext.xml sous a déclaré avec alors cette appliationContext.xml charge le beans.xml sous le même emplacement META-INF/spring of appliationContext.xml .

Tandis que; dans le code; s’il est déclaré comme ci-dessous

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

Cela regarde le fichier beans.xml à WEB-INF/classes ou dans eclipse src/main/resources .

[Si vous avez ajouté beans.xml à src/main/resources il peut être placé dans WEB-INF/classes lors de la création du fichier WAR.]

Donc, totalement deux fichiers sont recherchés.

J’ai résolu ce problème en ajoutant la recherche de classpath lors de l’importation à applicationContext.xml comme ci-dessous

  

et supprimé la ligne ClassPathXmlApplicationContext("beans.xml") dans le code Java, de sorte qu’il n’y aura qu’un seul ApplicationContext chargé.

Au 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 de spring dans le dossier de ressources.

Assurez-vous que vous avez également l’entrée ClassPath pour vos fichiers dans src / main / resources.

Dans .classpath, vérifiez les 2 lignes suivantes. S’ils manquent, ajoutez-les.

   

Donc, si vous avez tout en place, le code ci-dessous devrait fonctionner.

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

J’ai fait le contraire de la plupart. J’utilise Force IDE Luna Java EE et j’ai placé mon fichier Beans.xml dans le package; Cependant, j’ai précédé la chaîne Beans.xml – pour l’argument ClassPathXMLApplicationContext – avec le chemin relatif. Donc, dans mon application principale – celle qui accède au fichier Beans.xml – j’ai:

  ApplicationContext context = new ClassPathXmlApplicationContext("com/tutorialspoin/Beans.xml"); 

J’ai également remarqué que dès que j’ai déplacé le fichier Beans.xml dans le package à partir du dossier src, il y avait une image Bean en bas à gauche de l’icône du fichier XML qui n’était pas présente lorsque ce fichier xml était en dehors du package. C’est un bon indicateur pour me faire savoir que maintenant le fichier xml beans est accessible par ClassPathXMLAppllicationsContext.

C’est ce qui a fonctionné pour moi:

  new ClassPathXmlApplicationContext("classpath:beans.xml"); 

Si ce problème continue de vous embêter et que vous développez en utilisant Eclipse, jetez un oeil à ce bogue Eclipse: Les fichiers de ressources de “src / main / resources” ne sont pas correctement inclus dans classpath

La solution semble être de regarder les propriétés du projet, le chemin de construction Java, les dossiers sources. Supprimez le /src/main/resources et ajoutez-le à nouveau. Cela permet de rappeler à Eclipse qu’il doit copier ces fichiers dans le chemin de classe.

Ce bug m’a affecté lors de l’utilisation de la version “Neon” d’Eclipse. (Et était très frustrant jusqu’à ce que je réalise la solution simple que je viens de décrire)