Comment accéder à des fichiers dans les ressources statiques(WEB-INF) dossier de référencement projet java?
J'ai une application web, qui contient un fichier xml de configuration pour l'un de mes services d'application qui est exposé, comme le printemps de haricot.
Aussi, j'ai une application java autonome(les références de mon application web du projet à partir de son pom.xml) dans le même espace de travail, qui exécute les tests à l'aide de Spring framework TestContext et l'un des tests de vérifications de la configuration de ce fichier XML.
Cependant j'ai un problème avec l'accès à ce fichier xml à partir de l'application autonome:
Avant la mise en place de l'essai, dans ma configuration précédente, le fichier a été accédé par le biais de ServletContext et était situé dans WEB-INF/ dossier. Cependant, pour le rendre accessible à partir de la projet de test, j'ai dû le déplacer vers source/ dossier et de le charger avec getClassLoader().getResourceAsStream() la méthode plutôt que de ServletContext. Mais il fait en modifiant le fichier lourd car à chaque fois que l'application doit être redéployés.
Est-il possible de garder le fichier en WEB-INF/ dossier, mais le charger à partir de la référence au projet pendant les essais?
P. S. Actuellement, c'est un STS projet avec le serveur Tomcat.
OriginalL'auteur Boris Treukhov | 2012-05-17
Vous devez vous connecter pour publier un commentaire.
Certainement garder le fichier de sous WEB-INF/dossier si c'est là où il est censé vivre.
Pour vos classes de test qui sont en train d'être exécuté depuis la ligne de commande. Vous pouvez utiliser getClassLoader().getResource() sur un fichier que vous savez qui est à la racine de votre classpath (par ex. l'application.fichier de propriétés). À partir de là, vous connaissez la structure de votre projet et où trouver de la WEB-INF/par rapport au fichier de propriétés. Depuis elle renvoie une URL que vous pouvez l'utiliser pour trouver un chemin vers les fichiers XML que vous êtes à la recherche pour.
Nous espérons que vous trouverez ce utile. J'ai dû faire des hypothèses sur la façon dont vos classes de test sont en cours d'exécution, etc.
Prendre un coup d'oeil à la Fichier De Classe et c'est getPath(), getAbsolutePath(), et getParent() les méthodes qui pourraient vous être utiles.
Oui, vous avez raison, parce que vous avez une application web, il doit utiliser la norme ServletContext pour accéder à des fichiers dans le dossier WEB-INF. Ensuite seulement de mettre en œuvre cette jiggery-pokery pour votre code de test.
OriginalL'auteur Brad
J'ai fini par utiliser le Printemps MockServletContext de la classe et de l'injecter directement à mon service bean, avant le test s'exécute, comme mon service a mis en place
ServletContextAware
:Si j'avais plusieurs classes à l'aide de Servlet Contexte, la meilleure solution serait d'utiliser WebApplicationContext plutôt que celui par défaut (actuellement assurée par DelegatingSmartContextLoader), mais elle nécessiterait la mise en œuvre personnalisée ContextLoader classe et en passant son nom de la classe à @ContextConfiguration annotation.
alternative et un peu plus propre solution qui plus tard est venu à mon esprit, c'est de refactoriser le service et injecter
ServletContext
via@Autowired
au lieu de vous embêter avecServletContextAware
, et de fournir le bean de type correspondant(en fait, uneMockServletContext
exemple).Éventuellement, à l'avenir, le soutien direct deMockServletContext
de classes de test seront ajoutés au Printemps voir SPR-5399 et SPR-5243.MISE À JOUR POUR LE PRINTEMPS 3.2
Au Printemps 3.2 initialisation de la servlet contexte est aussi simple que l'ajout d'une
@WebAppConfiguration
annotation:voir les détails dans l'article
OriginalL'auteur Boris Treukhov
Dans un projet Maven, j'ai eu même problème. Je n'avais pas de servletContext et ne pouvais pas accéder à des fichiers statiques dans
Répertoire WEB-INF.
Je suis tombé sur une solution par l'ajout d'un pom.xml ce qui m'a donné accès à l'annuaire. Il comprend en fait ce chemin à la variable classpath.
PS: j'ai été en utilisant conteneur Tomcat
OriginalL'auteur a.valchev
C'est un chemin de classe de ressource, afin de le mettre sur le chemin de la classe: $webapp/WEB-INF/classes
Projets Maven va copier les choses en $module/src/main/resources à cet emplacement lors de l'emballage de la webapp.
(le premier est un sourcepath, le dernier - WEB-INF/classes - est toujours mis sur le chemin de la classe par le conteneur de servlet, par spec.)
Vous pouvez utiliser le plugin jetty et puis exécutez votre webapp 'non'... qui devraient vous aider: wiki.eclipse.org/Jetty/Feature/...
+1 pour les intéressantes jetée lien, mais maintenant mes tests s'exécutent très bien sans un serveur web(par le biais de l'évaluation du Printemps Contexte du cadre)
OriginalL'auteur ianpojman