web-dev-qa-db-fra.com

Emplacement de spring-context.xml

Lorsque j'exécute mon application sur Tomcat, le fichier spring-context.xml se trouve à l'adresse

/WEB-inf/spring-context.xml

C'est acceptable. Mais en exécutant un test junit, je dois lui fournir l'emplacement de mon spring-test-context.xml comme ceci:

@ContextConfiguration(locations={"classpath:/spring-test-context.xml"})

La seule façon dont cela fonctionne est si le fichier se trouve dans

/src/spring-context.xml

Comment puis-je faire en sorte que mon application trouve mes fichiers Spring-Context au même emplacement? Pour que cela fonctionne avec les testicules junit et déployé sur tomcat?

J'ai essayé cela et cela m'a donné beaucoup d'erreurs de ne pas trouver de haricots, mais il n'a pas dit qu'il ne pouvait pas trouver le fichier ..

classpath:/WEB-INF/spring-test-context.xml
20
Tommy

Comme l'indique duffymo, le Spring TestContext Framework (TCF) suppose que les emplacements de chaîne se trouvent dans le chemin de classe par défaut. Pour plus de détails, consultez la JavaDoc pour ContextConfiguration .

Notez, cependant, que vous pouvez également spécifier des ressources dans le système de fichiers avec un chemin absolu ou relatif en utilisant l'abstraction des ressources de Spring (c'est-à-dire en utilisant le préfixe "file:"). Vous pouvez trouver des détails à ce sujet dans JavaDoc pour la méthode modifyLocations () dans AbstractContextLoader de Spring.

Ainsi, par exemple, si votre fichier de configuration XML se trouve dans "src/main/webapp/WEB-INF/spring-config.xml" dans votre dossier de projet, vous pouvez spécifier l'emplacement comme chemin d'accès relatif au système de fichiers comme suit:

@ContextConfiguration("file:src/main/webapp/WEB-INF/spring-config.xml")

Vous pouvez également stocker vos fichiers de configuration Spring dans le chemin de classe (par exemple, src/main/resources), puis référencez-les via le chemin de classe dans votre configuration Spring MVC - par exemple:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/spring-config.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Avec cette approche, votre configuration de test ressemblerait simplement à ceci (notez la barre oblique principale qui indique que la ressource est à la racine du chemin de classe):

@ContextConfiguration("/spring-config.xml")

Vous pouvez également trouver utile la section Configuration de contexte avec ressources XML du manuel de référence.

Cordialement,

Sam

(auteur de Spring TestContext Framework)

38
Sam Brannen

Le problème est que/WEB-INF n'est pas dans le CLASSPATH pour une application web. Cependant,/WEB-INF/classes l'est.

Votre problème avec les tests est que vous n'êtes pas en cours d'exécution sur un serveur d'applications, donc WEB-INF/classes ne fait pas partie du CLASSPATH par défaut. Je recommanderais de configurer vos tests de sorte que WEB-INF/classes soit dans le CLASSPATH de test ou d'utiliser un chemin de fichier relatif ou absolu pour les trouver.

10
duffymo