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 la primavera de frijol.
También tengo una independiente de la aplicación java(que hace referencia a mi web, de la aplicación de su proyecto pom.xml) en la misma área de trabajo, que se ejecuta mediante pruebas de la Primavera de TestContext marco y una de las pruebas que comprueba la configuración de dicho archivo XML.

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

Antes de la creación de la prueba, en mi configuración anterior, el archivo se accede a través de ServletContext y se encuentra en WEB-INF/ carpeta. Sin embargo, para hacerlo accesible desde el proyecto de prueba que tuvo que pasar para fuente/ carpeta y cargar con getClassLoader().getResourceAsStream() método en lugar de ServletContext. Pero se hace editando el archivo incómodo porque cada vez que la aplicación tiene que ser reubicados.

Es posible mantener el archivo en WEB-INF/ carpeta sin embargo, la carga de la referencia a de proyecto durante la prueba se ejecuta?

P. S. en la Actualidad es un PTS proyecto con el servidor Tomcat.

OriginalEl autor Boris Treukhov | 2012-05-17

4 Comentarios

  1. 5

    Definitivamente mantener el archivo en WEB-INF/carpeta si que es de donde se supone que debemos vivir.

    Para sus clases de prueba que se ejecuta desde la línea de comandos. Puede utilizar getClassLoader().getResource() en un archivo que usted sabe que está en la raíz de tu classpath (por ejemplo, aplicación.archivo de propiedades). Desde allí se puede conocer la estructura de su proyecto y donde encontrar la WEB-INF/en relación a las propiedades de archivo. Ya que devuelve una URL se puede utilizar para encontrar una ruta de acceso a los archivos XML que estás 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

    Esperamos que encuentre útil. He tenido que hacer suposiciones acerca de cómo las clases de prueba son runing etc.

    Echar un vistazo a la Archivo De Clase y es getPath(), getAbsolutePath(), y getParent() los métodos que podrían ser de utilidad para usted.

    Gracias, voy a tomar eso en cuenta. Sin embargo, el problema es que en un caso el archivo se debe acceder a través de la ServletContext, pero en otros casos a través de cargador de clases(que puede no funcionar bien en algunos servidores de aplicaciones supongo). Así que el problema es que debo cambiar entre el método de carga de recursos en dos casos(web y series de pruebas).
    Sí, usted está en lo correcto, porque usted tiene una aplicación web se debe utilizar el estándar ServletContext para acceder a los archivos en el WEB-INF de la carpeta. A continuación, sólo implementar esta jiggery-pokery para el código de prueba.

    OriginalEl autor Brad

  2. 2

    Que terminó con la Primavera MockServletContext clase e inyectando directamente a mi servicio de frijol, antes de que se ejecuta la prueba, como mi servicio implementado 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:../<my web project name>/src/main/webapp"); 
    
        myService.setServletContext(mockServletContext);        
    }

    Si tuve varias clases utilizando el Contexto de Servlet, entonces la mejor solución sería el uso de WebApplicationContext en lugar del predeterminado (actualmente DelegatingSmartContextLoader), pero requeriría la implementación de personalizado ContextLoader clase y pasando su nombre de la clase a @ContextConfiguration anotación.

    alternativa y un poco más limpio solución que más tarde vino a mi mente es que refactorizar el servicio de e inyectar ServletContext a través de @Autowired en vez de jugar con ServletContextAware, y proporcionar el bean de tipo correspondiente(efectivamente un MockServletContext ejemplo).

    Posiblemente, en el futuro, el apoyo directo de MockServletContext de las clases de prueba será añadido a la Primavera a ver SPR-5399 y SPR-5243.

    ACTUALIZACIÓN PARA LA PRIMAVERA 3.2
    En la Primavera de 3.2 inicialización del contexto de servlet se convirtió tan simple como añadir una @WebAppConfiguration anotación:

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

    ver detalles en el artículo

    OriginalEl autor Boris Treukhov

  3. 2

    En un proyecto de Maven yo tenía el mismo problema. Yo no tenía servletContext y no podía acceder a archivos estáticos en
    Directorio WEB-INF.
    Me encontré a una solución mediante la adición de entrada a pom.xml lo que me dio acceso al directorio. Se incluye esta ruta de acceso a la ruta de clases.

    PS: yo estaba usando el contenedor Tomcat

    <project>
        <build>
        <resources>
            <resource>
                <directory>src/main/webapp/WEB-INF</directory>
            </resource>
        </resources>
    </project>

    OriginalEl autor a.valchev

  4. 1

    Es una ruta de clases de recursos, por lo que lo puso en la ruta de clases: $webapp/WEB-INF/classes

    Proyectos Maven va a copiar cosas en $módulo/src/main/resources para esta ubicación cuando el empaquetado de la webapp.
    (el primero es un sourcepath, el último – WEB-INF/classes – siempre se pone en la ruta de clases por el contenedor de servlets, por spec.)

    Ya en la ruta de clase – ahora necesito volver a moverlo a la carpeta de contenido web ya que la aplicación debe implementarse cada vez que el archivo de los cambios que frena el desarrollo.
    Puede que desee utilizar el plugin de jetty y, a continuación, ejecute su webapp ‘suelto’… que debe ayudar a: wiki.eclipse.org/Jetty/Feature/…
    +1 por el interesante muelle de enlace, pero ahora mis pruebas funcionar bien sin un servidor web(por medio de la Primavera de Prueba Contexto marco)

    OriginalEl autor ianpojman

Dejar respuesta

Please enter your comment!
Please enter your name here