getResourceAsStream () restituisce sempre null

Ho la seguente struttura in un’applicazione Web Java:

TheProject -- [Web Pages] -- -- [WEB-INF] -- -- -- abc.txt -- -- index.jsp -- [Source Packages] -- -- [wservices] -- -- -- WS.java 

In WS.java , sto usando il seguente codice in un metodo Web:

 InputStream fstream = this.getClass().getResourceAsStream("abc.txt"); 

Ma restituisce sempre un valore nullo. Ho bisogno di leggere da quel file e leggo che se metti i file in WEB-INF , puoi accedervi con getResourceAsStream , tuttavia il metodo restituisce sempre un valore null .

Qualche idea su cosa potrei fare storto?

A proposito, la cosa strana è che questo funzionava, ma dopo aver eseguito un Clean and Build on the Project, ha improvvisamente smesso di funzionare: /

Per quanto ne so, il file deve essere corretto nella cartella in cui risiede la class 'this' , cioè non in WEB-INF/classs ma nidificata anche più in profondità (a meno che non si scriva in un pacchetto predefinito):

 net/domain/pkg1/MyClass.java net/domain/pkg1/abc.txt 

Mettere il file nelle tue sorgenti java dovrebbe funzionare, il compilatore copia il file insieme ai file di class.

Una chiamata a Class#getResourceAsStream(String) delega al programma di caricamento classi e la ricerca viene cercata nel percorso class. In altre parole, il codice corrente non funzionerà e dovresti inserire abc.txt in WEB-INF/classs , o in WEB-INF/lib se inserito in un file jar.

Oppure utilizzare ServletContext.getResourceAsStream(String) che consente ai contenitori servlet di rendere disponibile una risorsa per un servlet da qualsiasi posizione, senza utilizzare un programma di caricamento classi . Quindi usa questo da un servlet:

 this.getServletContext().getResourceAsStream("/WEB-INF/abc.txt") ; 

Ma c’è un modo per chiamare getServletContext dal mio servizio Web?

Se si utilizza JAX-WS, è ansible immettere un object WebServiceContext :

 @Resource private WebServiceContext wsContext; 

E quindi ottenere il ServletContext da esso:

 ServletContext sContext= wsContext.getMessageContext() .get(MessageContext.SERVLET_CONTEXT)); 

Invece di

 InputStream fstream = this.getClass().getResourceAsStream("abc.txt"); 

uso

 InputStream fstream = this.getClass().getClassLoader().getResourceAsStream("abc.txt"); 

In questo modo apparirà dalla radice, non dal percorso della class di richiamo corrente

Penso che in questo modo è ansible ottenere il file da “ovunque” (comprese le posizioni dei server) e non è necessario preoccuparsi di dove metterlo.

Di solito è una ctriggers pratica doversi preoccupare di queste cose.

 Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties"); 

Non so se questo si applica a JAX-WS, ma per JAX-RS sono stato in grado di accedere a un file iniettando un ServletContext e quindi richiamando getResourceAsStream () su di esso:

 @Context ServletContext servletContext; ... InputStream is = servletContext.getResourceAsStream("/WEB-INF/test_model.js"); 

Si noti che, almeno in GlassFish 3.1, il percorso doveva essere assoluto, cioè iniziare con una barra. Maggiori informazioni qui: Come utilizzo un file delle proprietà con jax-rs?

Ho avuto lo stesso problema quando sono passato da Websphere 8.5 a WebSphere Liberty.

Ho utilizzato FileInputStream invece di getResourceAsStream() , perché per qualche motivo WebSphere Liberty non è in grado di individuare il file nella cartella WEB-INF .

La sceneggiatura era:

 FileInputStream fis = new FileInputStream(getServletContext().getRealPath("/") + "\WEBINF\properties\myProperties.properties") 

Nota: ho usato questo script solo per lo sviluppo.

Ho avuto un problema simile e ho cercato la soluzione per un po ‘di tempo: sembra che il parametro stringa sia case sensitive. Quindi se il tuo nome è abc.TXT ma cerchi abc.txt, eclipse lo troverà – il file JAR eseguibile no.