51 votes

getResourceAsStream () renvoie toujours la valeur null

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

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

En WS.java, je suis en utilisant le code suivant dans une Méthode Web:

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

Mais il est toujours retourner une valeur null. J'ai besoin de lire à partir de ce fichier, et j'ai lu que si vous mettez les fichiers dans WEB-INF, vous pouvez y accéder avec getResourceAsStream, mais la méthode est toujours de retourner un null.

Toutes les idées de ce que je fait de mal?

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

40voto

Jaroslav Záruba Points 1059

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

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

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

30voto

Pascal Thivent Points 295221

Un appel à l' Class#getResourceAsStream(String) des délégués de la classe loader et la ressource est recherché dans le chemin de classe. En d'autres termes, vous code actuel ne fonctionne pas et que vous devriez mettre de l' abc.txt en WEB-INF/classes, ou en WEB-INF/lib s'ils sont emballés dans un fichier jar.

Ou utiliser ServletContext.getResourceAsStream(String) qui permet à des conteneurs de servlet pour faire une ressource disponible pour une servlet à partir de n'importe quel endroit, sans l'aide d'un chargeur de classe. Utilisez ceci à partir d'une Servlet:

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

Mais est-il une manière que je peux appeler getServletContext de mon Web Service?

Si vous êtes à l'aide de JAX-WS, alors vous pouvez obtenir un WebServiceContext injecté:

@Resource
private WebServiceContext wsContext;

Et puis obtenir l' ServletContext d'elle:

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

7voto

jediz Points 144

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

C'est généralement une mauvaise pratique de se préoccuper de telles choses.

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

5voto

Matthew Cornell Points 734

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 ():

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

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

1voto

Ciro Hidalgo Points 11

J'ai eu le même problème lorsque j'ai changé Websphere 8.5 en WebSphere Liberty.

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

Le script était:

FileInputStream fis = new FileInputStream (getServletContext().getRealPath("/") + "\WEB-INF\properties\myProperties.properties")

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X