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: /
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.
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));
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
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");
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?
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.
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.