¿Cómo acceder al archivo en la carpeta de recursos estáticos (WEB-INF) desde el proyecto java de referencia?

Tengo una aplicación web, que contiene un archivo xml de configuración para uno de mis servicios de aplicación que se expone como bean bean. También tengo una aplicación java independiente (que hace referencia a mi proyecto de aplicación web desde su pom.xml) en el mismo espacio de trabajo, que ejecuta pruebas utilizando el marco Spring TestContext y una de las pruebas verifica la configuración de ese archivo XML.

Sin embargo, tengo un problema con el acceso a este archivo xml desde la aplicación independiente:

Antes de configurar la prueba, en mi configuración anterior, se accedía al archivo a través de ServletContext y se encontraba en la carpeta WEB-INF / . Sin embargo, para hacerlo accesible desde el proyecto de prueba, tuve que moverlo a la fuente / carpeta y cargarlo con el método getClassLoader (). GetResourceAsStream () en lugar del de ServletContext. Pero hace que la edición del archivo sea incómoda porque cada vez que la aplicación se tiene que volver a implementar.

¿Es posible mantener el archivo en la carpeta WEB-INF / pero cargarlo desde el proyecto de referencia durante las pruebas de ejecución?

PS Actualmente es un proyecto STS con servidor Tomcat.

Definitivamente, mantenga el archivo en la carpeta WEB-INF / si es donde se supone que debe vivir.

Para sus clases de prueba que se están ejecutando desde la línea de comandos. Puede usar getClassLoader (). GetResource () en un archivo que sepa que se encuentra en la raíz de su ruta de clase (por ejemplo, el archivo application.properties). A partir de ahí, conocerá la estructura de su proyecto y dónde encontrar WEB-INF / relativo al archivo de propiedades. Ya que devuelve una URL, puede usarla para encontrar una ruta a los archivos XML que está buscando.

URL url = this.getClass().getClassLoader().getResource("application.properties"); System.out.println(url.getPath()); File file = new File(url.getFile()); System.out.println(file); // now use the Files' path to obtain references to your WEB-INF folder 

Esperemos que te resulte útil. He tenido que hacer suposiciones sobre cómo se están ejecutando sus clases de prueba, etc.

Eche un vistazo a la Clase de archivo y verá los métodos getPath (), getAbsolutePath () y getParent () que podrían serle de utilidad.

Terminé usando la clase Spring MockServletContext e inyectándola directamente en mi bean de servicio, antes de que se ejecute la prueba, ya que mi servicio implementó ServletContextAware :

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "/test-ctx.xml" } ) public class SomeServiceTest { @Autowired private MyServletContextAwareService myService; @Before public void before(){ //notice that I had to use relative path because the file is not available in the test project MockServletContext mockServletContext = new MockServletContext("file:..//src/main/webapp"); myService.setServletContext(mockServletContext); } 

Si tuviera varias clases utilizando Contexto de Servlet, entonces la mejor solución sería usar WebApplicationContext en lugar de la predeterminada (actualmente proporcionada por DelegatingSmartContextLoader), pero requeriría implementar la clase personalizada ContextLoader y pasar su nombre de clase a @ContextConfiguration notation .

La solución alternativa y algo más limpia que más tarde me vino a la mente es refactorizar el servicio e inyectar ServletContext través de @Autowired lugar de jugar con ServletContextAware , y proporcionar el bean del tipo correspondiente (en realidad, una instancia de MockServletContext ).

Posiblemente, en el futuro, el soporte directo de MockServletContext desde las clases de prueba se agregará a Spring, ver SPR-5399 y SPR-5243 .

ACTUALIZACIÓN PARA LA PRIMAVERA 3.2 En la spring 3.2, la inicialización del contexto del servlet se hizo tan simple como agregar una anotación @WebAppConfiguration :

 @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration("file:..//src/main/webapp") @ContextConfiguration(locations = { "/test-ctx.xml" } ) public class SomeServiceTest { 

Ver detalles en el artículo.

En un proyecto de Maven tuve el mismo problema. No tenía servletContext y no podía acceder al archivo estático en el directorio WEB-INF. Encontré una solución agregando una entrada a pom.xml que me dio acceso al directorio. En realidad incluye este camino al classpath.

PD: estaba usando el contenedor Tomcat

     src/main/webapp/WEB-INF    

Es un recurso de classpath, así que póngalo en classpath: $ webapp / WEB-INF / classes

Los proyectos de Maven copiarán elementos en $ module / src / main / resources a esta ubicación al empaquetar la aplicación web. (el primero es una ruta de sour, el segundo, WEB-INF / classes, siempre se coloca en el classpath por el contenedor de servlets, según las especificaciones).