2012-06-26 19 views
20

Estoy tratando de hacerse con un archivo (o directorio) bajo /WEB-INF/.../Spring MVC Obtener archivo en WEB-INF sin una solicitud

exterior de una petición. Lo necesito en un bean cargado al inicio del servidor.

Todas las soluciones que puedo encontrar o bien quieren un archivo XML usando ClassPathXmlApplicationContext o una solicitud para obtener el contexto del servlet o utilizar la clase en ejecución actual. Me parece feo.

¿Cómo puedo obtener un File("/WEB-INF/myDir/"). Tiene que haber una manera, ¡no !?

Respuesta

35

Mientras su frijol se declara en el contexto de aplicación web se puede obtener una instancia de ServletContext (usando ServletContextAware, o por autoenvío).

Luego puede acceder a los archivos en el directorio de webapp directamente (getResourceAsStream(), getRealPath()), o usando ServletContextResource.

EDITAR por momo:

@Autowired 
ServletContext servletContext; 

... myMethod() { 
    File rootDir = new File(servletContext.getRealPath("/WEB-INF/myDIR/")); 
} 
+1

+1 para 'servletContext.getRealPath ("/WEB-INF/myDIR/")' – bizzr3

+0

La solución aportada por @mahesh justo debajo es mucho mejor, porque el Servicio Layer no debe tener dependencias de la capa web.ServletContext solo debería funcionar en Controladores y algo así. – Dani

+0

Además, el método getRealPath puede devolver nulo según el servidor de aplicaciones y/o la aplicación que se haya desplegado, como .war en weblogic. –

2

Puede usar el recurso classpath si el archivo se encuentra en el directorio WEB_INF\classes. Que es donde todos los archivos en el directorio de src/main/resources se copiarán en el uso de un experto en la acumulación normal de ...

import org.springframework.core.io.Resource 
... 
final Resource yourfile = new ClassPathResource("myfile.txt"); 
+4

'/ WEB-INF/myDir /' no es un recurso de ruta de clase. – axtavt

+0

@axtavt oh sí, asumió que era WEB-INF/classes – NimChimpsky

7

utilizo primaveraDefaultResourceLoader y de Recursos para leer en el interior WEB-INF o cualquier recurso en un archivo * .jar. Trabajar como un encanto. ¡Buena suerte!

"archivos"
import org.springframework.core.io.DefaultResourceLoader; 
import org.springframework.core.io.Resource; 

public static void myFunction() throws IOException { 
    final DefaultResourceLoader loader = new DefaultResourceLoader();    
    LOGGER.info(loader.getResource("classpath:META-INF/resources/img/copyright.png").exists());    
    Resource resource = loader.getResource("classpath:META-INF/resources/img/copyright.png");   
    BufferedImage watermarkImage = ImageIO.read(resource.getFile()); 
} 
+0

'DefaultResourceLoader' no puede leer dentro de WEB-INF, necesitará' ServletContextResource' para este – Derp

4
ClassLoader classLoader = getClass().getClassLoader(); 
File file = new File(classLoader.getResource("files/test.xml").getFile()); 

carpeta debe ser hijo de "main/resources" carpeta

1

Así es como se puede hacerlo si lo que desea es acceder a él desde un servicio (no a través de ServletContext) :

final DefaultResourceLoader loader = new DefaultResourceLoader(); 
    Resource resource = loader.getResource("classpath:templates/mail/sample.png"); 
    File myFile = resource.getFile(); 

Tenga en cuenta que la última línea puede lanzar IOException así que hay que coger/volver a lanzar

Tenga en cuenta, que el archivo está aquí: src\main\resources\templates\mail\sample.png

+1

Gracias, pero la pregunta era sobre hacerlo bajo WEB-INF – momomo

0

No del todo relacionado a su pregunta, pero ... Aquí hay alguna sulution universales i utilizado para cargar propiedades desde cualquier punto de la aplicación web, como lo hace la primavera (con soporte para WEB- INF/..., classpath: ..., file: ...). Está basado en el uso de ServletContextResourcePatternResolver. Necesitará ServletContext.

private static Properties loadPropsTheSpringWay(ServletContext ctx, String propsPath) throws IOException { 
    PropertiesFactoryBean springProps = new PropertiesFactoryBean(); 
    ResourcePatternResolver resolver = new ServletContextResourcePatternResolver(ctx); 
    springProps.setLocation(resolver.getResource(propsPath)); 
    springProps.afterPropertiesSet(); 
    return springProps.getObject(); 
} 

Utilicé el método anterior en mi escucha de contexto de servlet personalizado mientras conext aún no estaba cargado.

Cuestiones relacionadas