webentwicklung-frage-antwort-db.com.de

getResourceAsStream () gibt immer null zurück

Ich habe die folgende Struktur in einer Java Web Application:

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

In WS.Java Verwende ich den folgenden Code in einer Webmethode:

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

Aber es wird immer eine Null zurückgegeben. Ich muss aus dieser Datei lesen, und ich habe gelesen, dass Sie mit getResourceAsStream auf die Dateien zugreifen können, wenn Sie sie in WEB-INF Einfügen. Die Methode gibt jedoch immer ein null zurück. .

Irgendwelche Ideen, was ich falsch machen könnte?

Übrigens, das Seltsame ist, dass dies funktioniert hat, aber nachdem ich einen Clean and Build Für das Projekt durchgeführt habe, hat es plötzlich aufgehört zu funktionieren: /

45
Andreas Grech

Meines Wissens muss sich die Datei genau in dem Ordner befinden, in dem das 'this' Klasse wohnt, d. h. nicht in WEB-INF/classes aber noch tiefer verschachtelt (es sei denn, Sie schreiben in einem Standardpaket):

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

Wenn Sie die Datei in Ihre Java) - Quellen einfügen, kopiert der Compiler diese Datei zusammen mit den Klassendateien.

40

Ein Aufruf von Class#getResourceAsStream(String) delegiert an den Klassenladeprogramm und die Ressource wird im Klassenpfad gesucht. Mit anderen Worten, Ihr aktueller Code funktioniert nicht und Sie sollten abc.txt In WEB-INF/classes Oder in WEB-INF/lib Einfügen, wenn Sie in eine JAR-Datei gepackt sind.

Oder verwende ServletContext.getResourceAsStream(String) welches erlaubt Servlet-Containern, eine Ressource einem Servlet zur Verfügung zu stellen von jedem Ort aus, ohne einen Klassenlader zu benutzen. Also benutze dies von einem Servlet:

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

Gibt es eine Möglichkeit, getServletContext von meinem Webdienst aus aufzurufen?

Wenn Sie JAX-WS verwenden, können Sie ein WebServiceContext injizieren lassen:

@Resource
private WebServiceContext wsContext;

Und dann holen Sie sich das ServletContext daraus:

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

Anstatt

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

verwenden

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

Auf diese Weise sieht es vom Stamm aus, nicht vom Pfad der aktuell aufrufenden Klasse

19
Mike-Bell

Ich denke, auf diese Weise können Sie die Datei von "überall" (einschließlich Serverstandorten) abrufen und müssen sich nicht darum kümmern, wo sie abgelegt werden soll.

Es ist normalerweise eine schlechte Praxis, sich um solche Dinge kümmern zu müssen.

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

Ich weiß nicht, ob dies für JAX-WS gilt, aber für JAX-RS konnte ich auf eine Datei zugreifen, indem ich einen ServletContext einfügte und dann getResourceAsStream () aufrief:

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

Beachten Sie, dass der Pfad zumindest in GlassFish 3.1 absolut sein musste, d. H. Mit einem Schrägstrich beginnen. Mehr hier: Wie verwende ich eine Eigenschaftendatei mit jax-rs?

5
Matthew Cornell

Ich hatte das gleiche Problem, als ich von Websphere 8.5 auf WebSphere Liberty umgestiegen bin.

Ich habe FileInputStream anstelle von getResourceAsStream() verwendet, weil WebSphere Liberty die Datei aus irgendeinem Grund nicht im Ordner WEB-INF Finden kann.

Das Drehbuch lautete:

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

Hinweis: Ich habe dieses Skript nur für die Entwicklung verwendet.

1
Ciro Hidalgo

Ich hatte ein ähnliches Problem und habe eine ganze Weile nach der Lösung gesucht: Es scheint, dass der String-Parameter zwischen Groß- und Kleinschreibung unterscheidet. Wenn Ihr Dateiname also abc.TXT lautet, Sie aber nach abc.txt suchen, wird Eclipse ihn finden - die ausführbare JAR-Datei nicht.

1
Dominik Maresch