[Java] Webservice en bestanden lezen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Tjeerd
  • Registratie: Oktober 1999
  • Laatst online: 11:01

Tjeerd

Be Original, Be Yourself.

Topicstarter
Ik loop al een hele tijd te zoeken, maar het is me niet duidelijk hoe ik vanuit mijn Java webservice kan werken met bestanden die ik mee heb gegeven in mijn gedeployde WAR. Ik werk met Eclipse en WTP en mijn WAR heeft de volgende structuur:

-META-INF
-WEB-INF
--MijnService
--Scripts
--classes
--lib
--web.xml
--server-config.wsdd
-wsdl

Ik heb een eenvoudige klasse geschreven met een paar methoden die als webservice beschikbaar worden gesteld. Het aanroepen van de webservice op zich gaat prima, alleen niet het stuk code waarmee ik een bestand (mijnscript.txt) server-side wil inlezen.

Naar ik heb begrepen zijn de bestanden in WEB-INF niet zomaar benaderbaar van "buitenaf", alles wat daarboven staat (WebContent) is dat wel. In de map "Scripts" zitten bestanden die ik wil lezen vanuit mijn webservice. Helaas krijg ik het niet voor elkaar. Ik heb het al geprobeerd met:

Java:
1
2
InputStream is = this.getClass().getResourceAsStream("/WEB-INF/Scripts/mijnscript.txt");
System.err.println("Geeft: " + is);

Maar dit geeft een null terug. Misschien zit ik op het verkeerde pad. Ik kom ook dingen tegen zoals de ServletContext die ik zou moeten gebruiken om een bestand te lezen. Maar ik zie dan weer alleen voorbeelden waarbij ik mijn webservice als servlet moet implementeren en dan gaat ook Eclipse/WTP zeuren dat ik rare dingen aan het doen ben.

Dus de vraag: hoe kan ik binnen mijn webservice bestanden lezen die ik meegedeployed heb?

[ Voor 12% gewijzigd door Tjeerd op 26-11-2008 14:19 ]

www.tjeerd.net - To repeat what others have said, requires education, to challenge it, requires brains.


Acties:
  • 0 Henk 'm!

Verwijderd

getResourceAsStream kijkt alleen in je classpath, in dit geval zal dat je WEB-INF/classes directory zijn + alle libraries in WEB-INF/lib + eventuele libraries van de applicatie server.

In dit geval moet je volgens mij de java.io.File klasse gebruiken om het bestand te vinden bijvoorbeeld

Java:
1
2
File file = new File("WEB-INF/Scripts/mijnscript.txt");
InputStream is = new FileInputStream(file);

Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Je mag nooit uitgaan dat de huidige werkdirectory in elk omgeving dezelfde is. Gebruik daarbij liever ServletContext#getRealPath(). Geef de relative WEB-INF path op en je krijgt geheel omgevingsonafhankelijk een absolute bestandssysteem pad terug die je dan weer in File() kunt gebruiken.

edit:
Oeh, geheel over hoofd gezien dat je dit al had overwegen.

Class#getResourceAsStream() geeft alleen resources terug die zich in de classpath bevinden. De /WEB-INF is daar standaard niet deel van, maar de /WEB-INF/lib is dat standaard wel. Je zou kunnen overwegen om de bestanden daarin te plaatsen, of de pad naar die bestanden toevoegen aan de classpath.

[ Voor 55% gewijzigd door BalusC op 26-11-2008 15:00 ]


Acties:
  • 0 Henk 'm!

  • Tjeerd
  • Registratie: Oktober 1999
  • Laatst online: 11:01

Tjeerd

Be Original, Be Yourself.

Topicstarter
Dank voor de snelle antwoorden. Ik heb zojuist toch nog even gekeken naar iets als WebServiceContext. Daarbij het volgende stukje code gebruikt:

Java:
1
2
3
4
private WebServiceContext context;

ServletContext servletContext = (ServletContext) context.getMessageContext().get(MessageContext.SERVLET_CONTEXT);       
System.err.println("servletcontext = " + servletContext.getRealPath("/"));
Maar dat geeft zo te zien ook null terug.

Ik had ook begrepen dat inderdaad door mijn "scripts" in de class of lib map te zetten wel toegang te kunnen krijgen - nog niet geprobeerd. Maar het moet toch ook wel mogelijk zijn om gewoon een aparte map (WEB-INF/scripts) te kunnen benaderen? Ik heb niet echt een beste methode waar ik mijn bestanden moet neerzetten eigenlijk, maar zoals ik dus al zei, een WEB-INF/scripts leek me een logische plek.

[ Voor 7% gewijzigd door Tjeerd op 26-11-2008 15:15 ]

www.tjeerd.net - To repeat what others have said, requires education, to challenge it, requires brains.


Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Zoals gezegd, Class#getResourceAsStream() zoekt de classpath af. Voeg de nieuwe map gewoon toe aan de classpath.

Acties:
  • 0 Henk 'm!

  • Tjeerd
  • Registratie: Oktober 1999
  • Laatst online: 11:01

Tjeerd

Be Original, Be Yourself.

Topicstarter
BalusC schreef op woensdag 26 november 2008 @ 15:31:
Zoals gezegd, Class#getResourceAsStream() zoekt de classpath af. Voeg de nieuwe map gewoon toe aan de classpath.
Maar is er dan niet het risico dat bij het in gebruik nemen op een andere server ik ook daar de classpath moet instellen om te verwijzen naar die scripts-map? Ik dacht dat het mogelijk was om een WAR te maken en juist door die ergens in een nieuwe Tomcat-installatie neer te zetten, de webservice zelf kan uitvogelen waar hij staat en waar hij zijn scripts (mijnscript.txt) vandaan moet halen. Eigenlijk weet ik zelf ook niet wat de beste oplossing is. Of is het mogelijk om ergens aan te geven in een XML-bestand binnen de WAR wat de classpaths zijn? Ben zelf alleen gewend om vanaf de CLI classpaths in te stellen.

[ Voor 4% gewijzigd door Tjeerd op 26-11-2008 15:41 ]

www.tjeerd.net - To repeat what others have said, requires education, to challenge it, requires brains.


Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Gebruik de manifest file om paden voor de classpath te toevoegen. Of zet ze gewoon in de bestaande classpath. Je mag wel folders (packages) aanmaken hoor. Bijvoorbeeld /WEB-INF/classes/scripts ofzo.

[ Voor 4% gewijzigd door BalusC op 26-11-2008 15:48 ]


Acties:
  • 0 Henk 'm!

  • Tjeerd
  • Registratie: Oktober 1999
  • Laatst online: 11:01

Tjeerd

Be Original, Be Yourself.

Topicstarter
Ik heb mijn manifest aangepast met:
Manifest-Version: 1.0
Class-Path: WEB-INF/Scripts/
Mijn Java-code is als volgt nu:

Java:
1
2
InputStream is = this.getClass().getResourceAsStream("mijnscript.txt");
System.err.println("Geeft: " + is);

Als ik het goed begrijp zoekt hij nu toch ook automatisch in de WEB-INF/Scripts map naar mijnscript.txt? Ik krijg nog steeds een null als ik de InputStream wil afdrukken |:(

www.tjeerd.net - To repeat what others have said, requires education, to challenge it, requires brains.


Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Kennelijk negeert Eclipse of Tomcat de manifest.

Welja, zet het gewoon in een van de default classpath paden zoals /WEB-INF/classes of in een eigen package in de /Javasource.

Acties:
  • 0 Henk 'm!

  • LAN
  • Registratie: Oktober 2000
  • Niet online

LAN

Het lijkt me dat this.getClass().getResourceAsStream("mijnscript.txt"); zoekt naar mijnscript.txt ten opzichte van de klasse die met this wordt gerefereerd.

Tenzij dat je mijnscript.txt in dezelfde package zet als die klasse gaat deze constructie zo niet werken.

Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Nee dat is niet het geval en al helemaal ook niet het probleem hier :)

edit:
En je loopt ook nog te patsen met 'Sun Certified' zooi in je sig terwijl het basisconcept "classpath" je niet eens volledig bekend is :X

[ Voor 93% gewijzigd door BalusC op 26-11-2008 17:48 ]


Acties:
  • 0 Henk 'm!

  • LAN
  • Registratie: Oktober 2000
  • Niet online

LAN

Klaarblijkelijk heb ik de kennis niet paraat.
Met dank aan BalusC voor het terechtwijzen.

  • Tjeerd
  • Registratie: Oktober 1999
  • Laatst online: 11:01

Tjeerd

Be Original, Be Yourself.

Topicstarter
Ik heb ook nog verder rond zitten kijken en dan kom je o.a.artikelen tegen zoals Location-Independent Access to Resources. Ik heb nog verder zitten zoeken, maar wat ik wilde, dus neerzetten in WebContent/WEB-INF/Scripts krijg ik gewoon niet voor elkaar.

De oplossing is voor mij om het toch maar in WebContent/WEB-INF/classes/Scripts neer te zetten - vanuit Eclipse heb ik een nieuwe package (map) genaamd Scripts aangemaakt die in de "src" map komt te staan en waar ik mijn losse scripts in kan zetten. Vervolgens kan ik er bij door in mijn Java code te roepen:

Java:
1
2
InputStream is = this.getClass().getResourceAsStream("/Scripts/mijnscript.txt");
System.err.println("geeft: " + is);


Toch bedankt voor jullie aandacht.

www.tjeerd.net - To repeat what others have said, requires education, to challenge it, requires brains.

Pagina: 1