2012-06-26 3 views
20

Sto cercando di entrare in possesso di un file (o una directory) sotto /WEB-INF/.../Spring MVC ottenere il file sotto WEB-INF senza una richiesta

al di fuori di una richiesta. Ne ho bisogno in un bean caricato all'avvio del server.

Tutte le soluzioni che posso trovare vogliono un file XML utilizzando ClassPathXmlApplicationContext o una richiesta per ottenere il contesto servlet o l'utilizzo della classe di esecuzione corrente. Sembra brutto per me.

Come posso ottenere File("/WEB-INF/myDir/"). Ci deve essere un modo, no !?

risposta

35

Finché il fagiolo è dichiarata nel contesto di applicazione web è possibile ottenere un'istanza di ServletContext (usando ServletContextAware, o tramite autowiring).

Quindi è possibile accedere ai file nella directory webapp direttamente (getResourceAsStream(), getRealPath()) o utilizzando ServletContextResource.

EDIT momo:

@Autowired 
ServletContext servletContext; 

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

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

+0

La soluzione fornita da @mahesh appena sotto è molto meglio, perché il Servizio Il livello non dovrebbe avere dipendenze dal livello Web.ServletContext deve essere eseguito solo nei controller e qualcosa del genere. – Dani

+0

Inoltre, il metodo getRealPath può restituire null a seconda del server dell'applicazione e/o dell'applicazione è stato distribuito, ad esempio .war in weblogic. –

2

È possibile utilizzare la risorsa percorso classe se il file si trova nella directory WEB_INF\classes. Che è dove tutti i file nella directory src/main/resources verranno copiati utilizzando un normale accumulo esperto di ...

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

'/ WEB-INF/myDir /' non è una risorsa del percorso di classe. – axtavt

+0

@axtavt oh si, supponevo che fosse WEB-INF/classes – NimChimpsky

7

Io uso PrimaveraDefaultResourceLoader e Resource per leggere dentro WEB-INF o tutte le risorse in un file * .jar. Funziona come un fascino. In bocca al lupo!

"file"
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' non è in grado di leggere all'interno di WEB-INF, è necessario' ServletContextResource' per questo – Derp

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

cartella deve essere figlio di "main/risorse" cartella

1

In questo modo si può fare se si desidera solo per accedervi da un servizio (non attraverso ServletContext) :

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

si noti che l'ultima riga può gettare IOException quindi è necessario prendere/rethrow

Nota, che il file è qui: src\main\resources\templates\mail\sample.png

+1

Grazie, ma la domanda riguardava il recupero in WEB-INF – momomo

0

Non del tutto correlata alla tua domanda, ma ... Ecco alcuni sulution universale che ho usato per caricare oggetti di qualsiasi parte di applicazioni web come molla lo fa (supporto WEB- INF/..., classpath: ..., file: ...). È basato sull'uso di ServletContextResourcePatternResolver. Avrai bisogno di 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(); 
} 

Ho usato il metodo sopra nel mio listener di contesto servlet personalizzato mentre conext non è stato ancora caricato.