web-dev-qa-db-fra.com

getResourceAsStream () renvoie toujours null

J'ai la structure suivante dans une application Web Java Web:

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

Dans WS.Java, J'utilise le code suivant dans une méthode Web:

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

Mais il renvoie toujours une valeur nulle. J'ai besoin de lire ce fichier, et je lis que si vous mettez les fichiers dans WEB-INF, vous pouvez y accéder avec getResourceAsStream, mais la méthode renvoie toujours un null.

Des idées de ce que je fais peut-être mal?

Btw, la chose étrange est que cela fonctionnait, mais après avoir effectué un Clean and Build sur le projet, il a soudainement cessé de fonctionner: /

45
Andreas Grech

À ma connaissance, le fichier doit se trouver directement dans le dossier où le 'this' la classe réside, c'est-à-dire pas dans WEB-INF/classes mais imbriqué encore plus profondément (sauf si vous écrivez dans un package par défaut):

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

Mettre le fichier dans vos Java devraient fonctionner, le compilateur copie ce fichier avec les fichiers de classe.

40

Un appel à Class#getResourceAsStream(String) délègue au chargeur de classe et la ressource est recherchée dans le chemin de classe. En d'autres termes, votre code actuel ne fonctionnera pas et vous devriez mettre abc.txt Dans WEB-INF/classes, Ou dans WEB-INF/lib S'il est emballé dans un fichier jar.

Ou utilisez ServletContext.getResourceAsStream(String) qui permet aux conteneurs de servlet de mettre une ressource à la disposition d'une servlet depuis n'importe quel endroit, sans utiliser de chargeur de classe. Utilisez donc ceci à partir d'un servlet:

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

Mais existe-t-il un moyen d'appeler getServletContext à partir de mon service Web?

Si vous utilisez JAX-WS, vous pouvez obtenir un WebServiceContext injecté:

@Resource
private WebServiceContext wsContext;

Et puis récupérez le ServletContext:

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

Au lieu de

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

utilisation

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

De cette façon, il regardera depuis la racine, pas depuis le chemin de la classe invoquante actuelle

19
Mike-Bell

Je pense que de cette façon, vous pouvez obtenir le fichier de "n'importe où" (y compris les emplacements de serveur) et vous n'avez pas besoin de vous soucier de l'endroit où le mettre.

C'est généralement une mauvaise pratique d'avoir à se soucier de telles choses.

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

Je ne sais pas si cela s'applique à JAX-WS, mais pour JAX-RS, j'ai pu accéder à un fichier en injectant un ServletContext puis en appelant getResourceAsStream () dessus:

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

Notez que, au moins dans GlassFish 3.1, le chemin devait être absolu, c'est-à-dire commencer par une barre oblique. Plus ici: Comment utiliser un fichier de propriétés avec jax-rs?

5
Matthew Cornell

J'ai eu le même problème lorsque je suis passé de Websphere 8.5 à WebSphere Liberty.

J'ai utilisé FileInputStream au lieu de getResourceAsStream(), car pour une raison quelconque, WebSphere Liberty ne peut pas localiser le fichier dans le WEB-INF dossier.

Le script était:

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

Remarque: J'ai utilisé ce script uniquement pour le développement.

1
Ciro Hidalgo

J'ai eu un problème similaire et j'ai cherché la solution pendant un bon moment: il semble que le paramètre de chaîne soit sensible à la casse. Donc, si votre nom de fichier est abc.TXT mais que vous recherchez abc.txt, Eclipse le trouvera - le fichier JAR exécutable ne le fera pas.

1
Dominik Maresch