Avatar billede margitbork Nybegynder
19. august 2004 - 10:48 Der er 70 kommentarer og
1 løsning

webservice og læsning af xml fil

Jeg skal til at igang med et program der skal kunne kalde en webservice, få et XML svar tilbage og skrive resultatet ned i en database.
Jeg har ikke så meget erfaring med XML og tænkte at jeg måske her hurtigt kunne blive sat på sporet af hvad jeg har brug for at lære noget om, og om der findes noget java der kan forstå XML format.
Så er der nogle gode links der kan anbefales.
Avatar billede arne_v Ekspert
19. august 2004 - 10:59 #1
Avatar billede arne_v Ekspert
19. august 2004 - 11:00 #2
Men er du helt sikker på at du overhoevedet skal ned pÅ XML laget ?

Ofte kan man encapsulate alt det XML og bare kalde remote metoder
(ligesom RMI).

En anden relevant artikel:

http://www.eksperten.dk/artikler/159
Avatar billede margitbork Nybegynder
19. august 2004 - 13:15 #3
Jeg forsøger at følge det eksempel du har i artikel 159.
Men når jeg laver den første fil Calc.jws og kopierer den over i
din-servlet-engine/webapps/axis, og kalder den med stien
http://localhost/axis/Calc.jws får jeg først beskeden, der er en webservice her,
men når jeg vil se dens  WSDL får jeg en fejlbesked
AXIS error
Sorry, something seems to have gone wrong... here are the details:

Fault - ; nested exception is:
    java.io.FileNotFoundException: D:\jakarta-tomcat-4.1.30\webapps\axis\WEB-INF\jwsClasses\Calc.class (The system cannot find the file specified)
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.io.FileNotFoundException: D:\jakarta-tomcat-4.1.30\webapps\axis\WEB-INF\jwsClasses\Calc.class (The system cannot find the file specified)
faultActor:
faultNode:
faultDetail:


Hvad gør jeg galt ?
Avatar billede margitbork Nybegynder
19. august 2004 - 13:16 #4
Hvordan får jeg lavet en Calc.class, når det ikke er en java fil ?
Avatar billede arne_v Ekspert
19. august 2004 - 13:18 #5
Den skal selv compile.
Avatar billede arne_v Ekspert
19. august 2004 - 13:18 #6
Ligesom med JSP sider.
Avatar billede margitbork Nybegynder
19. august 2004 - 13:24 #7
min j2ee kender ikke
javax.xml.rpc.*;
javax.xml.namespace.*;
Skal jeg have fat i en nyere udgave eller hvad
Avatar billede arne_v Ekspert
19. august 2004 - 13:24 #8
Det virker hos mig.

Er det en helt standard Axis 1.1 web app du har deployet ?
Avatar billede arne_v Ekspert
19. august 2004 - 13:27 #9
De pakker ligger i nogle af de jar filer der er i axis/WEB-INF/lib.
Avatar billede arne_v Ekspert
19. august 2004 - 13:27 #10
Og i axis installationens lib directory
Avatar billede margitbork Nybegynder
19. august 2004 - 13:30 #11
Ja jeg har lige downloaded Axis 1.1
Dernæst unzippede jeg og kopierede folderen axis over i min tomcat webapps.
Jeg har en tomcat 4.1.30.
Jeg har så lavet Calc.jws og placeret den i axis folderen i webapps på tomcat serveren. Det giver mig ovenstående resultat.
Jeg er nu gået igang med næste eksempel, TestCalc, og der har jeg problemer med at min IntelliJ ikke kender pakken rpc, og namespace under javax.xml, men det er nok bare et spørgsmål om at få en ny nok version af j2EE vil jeg tro.
Avatar billede margitbork Nybegynder
19. august 2004 - 13:31 #12
OK
Avatar billede margitbork Nybegynder
19. august 2004 - 13:34 #13
Nu har jeg fået min IntelliJ til at forstå hvad det er for nogle pakker jeg snakker om, men jeg får stadig fejl når jeg vil se min WSDL
Avatar billede arne_v Ekspert
19. august 2004 - 13:41 #14
Du har kopieret

\axis-1.1\webapps\axis

over som

\tomcat-4.1.30\webapps\axis

?
Avatar billede margitbork Nybegynder
19. august 2004 - 13:42 #15
Nå jeg fandt ud af hvad der var galt, Jeg er bare så vandt til java, så jeg havde startet med at lave filen som javafil og så blot omdøbt til .jws. MEN jeg skulle også lige fjerne package. Så nu får jeg en fin beskrivelse
Avatar billede arne_v Ekspert
19. august 2004 - 13:43 #16
he he
Avatar billede arne_v Ekspert
19. august 2004 - 13:44 #17
.jws er en nem måde at komme igang på.

Til rigtig seriøs brug vil man nok deploye en jar fil med klasser i pakker
og med deployment descriptor (.wsdd) etc..
Avatar billede margitbork Nybegynder
19. august 2004 - 13:50 #18
Når jeg forsøger at køre TestCalc får jeg følgende fejl:
javax.xml.rpc.ServiceException
    at javax.xml.rpc.ServiceFactory.newInstance(ServiceFactory.java:108)
    at dk.md.webservice.mrgtester.test.TestCalc.mul(TestCalc.java:16)
    at dk.md.webservice.mrgtester.test.TestCalc.main(TestCalc.java:31)
Exception in thread "main" Process terminated with exit code 1

Kan du se hvad der går galt. Jeg har rettet
        String endpoint = "http://localhost:8080/axis/Calc.jws";
til
        String endpoint = "http://localhost/axis/Calc.jws";
Avatar billede arne_v Ekspert
19. august 2004 - 13:56 #19
Hm - den fejlmeddelse er jo ret intetsigende.

Kører du Tomcat på port 80 ?
Avatar billede margitbork Nybegynder
19. august 2004 - 13:56 #20
Denne linje går galt
        ServiceFactory servfact = ServiceFactory.newInstance();
Avatar billede margitbork Nybegynder
19. august 2004 - 13:57 #21
Ja port 80.
Avatar billede margitbork Nybegynder
19. august 2004 - 14:00 #22
Måske er der noget galt med den jar jeg har, for det er jo egentligt en fejl inden jeg overhovedet selv laver noget, er det ikke?
Avatar billede margitbork Nybegynder
19. august 2004 - 14:03 #23
Jeg skulle bare have lidt flere .jar filer i mit library, så virker det.
Så der er altså nogle afhængigheder mellem jar filerne
Avatar billede margitbork Nybegynder
19. august 2004 - 14:15 #24
Så nu har jeg en lille webservice, og jeg kan kalde den, fint nok.
Ved det jeg skal lave, får jeg et svar i form af et xml dokument som jeg så skal have pillet informationer ud af til en database. Du skriver
Ofte kan man encapsulate alt det XML og bare kalde remote metoder
(ligesom RMI).
Det er ikke noget jeg kender til, så hvis du kan uddybe lidt vil det være fint
Avatar billede arne_v Ekspert
19. august 2004 - 14:19 #25
Du har kørt Calc eksemplet.

Hverken på client eller på server side har du kodet noget XML.

Men både request client->server og response server->client er sendt
som SOAP XML.

Men det søger Axis koden for både på client og server.

Du ser kun et klassisk API.

Axis lavet dit kald om til XML og sender det med HTTP.
Avatar billede margitbork Nybegynder
19. august 2004 - 14:23 #26
Det jeg mener er at den metode jeg skal kalde har et xml dokument som returparameter.
Måske har det i virkeligheden ikke så meget at gøre med den xml der anvendes til at sende med??
Jeg er ikke helt på sikker grund her endnu, så jeg tror at jeg vil adressere de næste par spørgsmål til vores makkere udi denne opgave ( dem der laver den webservice jeg skal kalde ) de må kunne give mig nogle af de informationer jeg mangler.
Hvis du er interesseret i at få points så post et svar
Avatar billede arne_v Ekspert
19. august 2004 - 14:25 #27
Spørgsmålet er om det XML dokument er user data eller kun transport for
user data.
Avatar billede arne_v Ekspert
19. august 2004 - 14:25 #28
svar
Avatar billede margitbork Nybegynder
19. august 2004 - 14:36 #29
den metode jeg skal kalde har flg. signatur ifølge en foranalyse

xmlDokument HentXMLObjekt(int fobjektnummer) men jeg kender ingen objekter af typen xmlDokument, så jeg er ikke helt sikker på hvad der menes.
Avatar billede margitbork Nybegynder
19. august 2004 - 15:05 #30
Jeg forsøger nu det der med objektet Person
Men jeg forstår ikke dette
Deployment:
(kopier først .class filer til classes eller .jar fil til lib som for enhver web app)
java -classpath axis.jar;jaxrpc.jar;commons-logging.jar;log4j-1.2.8.jar;commons-discovery.jar;saaj.jar org.apache.axis.client.AdminClient SortService.wsdd

hvor er det jeg skal placere SortService.wsdd ?
Avatar billede margitbork Nybegynder
19. august 2004 - 15:15 #31
jeg får flg når jeg forsøger ovenstående:

D:\>java -classpath axis.jar;jaxrpc.jar;commons-logging.jar;log4j-1.2.8.jar;commons-discovery.jar;saaj.jar
org.apache.axis.client.AdminClient SortService.wsdd

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/axis/client/AdminClient

Hvad er der galt
Avatar billede arne_v Ekspert
19. august 2004 - 15:22 #32
AdminClient bør være i  axis.jar
Avatar billede arne_v Ekspert
19. august 2004 - 15:23 #33
.wsdd filen er et normalt argument og skal være i current dir
Avatar billede margitbork Nybegynder
19. august 2004 - 15:24 #34
når man bare skriver sin classpath som ovenstående, hvordan ved java så hvor de jar filer er placeret?, skal jeg skrive stien ind til dem foran, så det kommer til at se sålede ud D:\axis-1_1\lib\*****.jar
Avatar billede margitbork Nybegynder
19. august 2004 - 15:25 #35
nu ser det således ud:
D:\webfragt\webservices\wsdd>java -classpath D:\axis-1_1\lib\axis.jar;D:\axis-1_1\lib\jaxrpc.jar;D:\axis-1_1\lib\commons-logging.jar;D:\axis-1_1\lib\log4j-1.2.8.jar;D:\axis-1_1\lib\commons-discovery.jar;D:\axis-1_1\lib\saaj.jar org.apache.axis.client.AdminClient SortService.wsdd
Processing file SortService.wsdd
Exception:: java.net.ConnectException: Connection refused: connect
Det virker ikke helt endnu
Avatar billede arne_v Ekspert
19. august 2004 - 15:26 #36
Ja medmindre der er i current dir
Avatar billede arne_v Ekspert
19. august 2004 - 15:36 #37
Jeg tror at den forsøger på port 8080.

Prøv at tilføje:

-p 80

til kommando linien
Avatar billede margitbork Nybegynder
19. august 2004 - 15:37 #38
Jeg syntes at det er ret uklart hvad det er jeg skal gøre for at komme videre med eksemplet.

Kan du komme med nogle kommentarer til din SortService.wsdd


>> Skal jeg her erstatte Sort med fuldgyldigt klassenavn incl package?        <parameter name="className" value="Sort"/>       

>> Hvad er det der genpakke for noget ??
xmlns:ns="http://genpakke"                    qname="ns:Person"                    type="java:Person"                 
>> skal jeg her skrive hele pakken for Person ??
Avatar billede margitbork Nybegynder
19. august 2004 - 15:38 #39
Unrecognized option: -p
Could not create the Java virtual machine.
Avatar billede margitbork Nybegynder
19. august 2004 - 15:39 #40
Jeg har også min tomcat kørende, og den er blevet genstartet siden jeg lagde .class filerne over på den
Avatar billede margitbork Nybegynder
19. august 2004 - 15:57 #41
Nå jeg holder for idag...
Avatar billede arne_v Ekspert
19. august 2004 - 16:02 #42
Ja className er fuld klasse navn inkl. pakke
Avatar billede arne_v Ekspert
19. august 2004 - 16:02 #43
......AdminClient -p 80 xxxx.wsdd
Avatar billede margitbork Nybegynder
20. august 2004 - 08:25 #44
får stadig følgende:
java -classpath D:\axis-1_1\lib\axis.jar;
D:\axis-1_1\lib\jaxrpc.jar;
D:\axis-1_1\lib\commons-logging.jar;
D:\axis-1_1\lib\log4j-1.2.8.jar;
D:\axis-1_1\lib\commons-discovery.jar;
D:\axis-1_1\lib\saaj.jar
org.apache.axis.client.AdminClient -p 80 SortService.wsdd
Exception:: java.net.ConnectException: Connection refused: connect
Avatar billede margitbork Nybegynder
20. august 2004 - 08:27 #45
Godmorgen -
Det hjalp at starte serveren
Nu skriver den
Processing file SortService.wsdd
<Admin>Done processing</Admin>, så hurra jeg kan komme videre
Avatar billede margitbork Nybegynder
20. august 2004 - 08:30 #46
Hmmm nu ville jeg læse videre på artiklen, men får endnu en gang besked om at jeg skal betale 5 point for at få evig adgang til artiklen. Igår betalte jeg to gange..
Det virker ikke helt godt
Avatar billede margitbork Nybegynder
20. august 2004 - 08:48 #47
Nå, jeg ved ikke hvad jeg gør galt, måske skal jeg placere den der SortService et bestemt sted? skal den placeres i tomcat/webapps/axis/??? eller et sted derunder ?
Avatar billede margitbork Nybegynder
20. august 2004 - 09:00 #48
Nå, efter jeg har placeret den i tomcat/webapps/axis og processeret den der har jeg nu fået en blank side i browseren når jeg kalder http://localhost/axis/SortService.wsdd. Er det korrekt ?
Avatar billede margitbork Nybegynder
20. august 2004 - 09:01 #49
Avatar billede arne_v Ekspert
20. august 2004 - 09:53 #50
Hvis du browwser til http://localhost/axis/ kan du vælge se services
Avatar billede arne_v Ekspert
20. august 2004 - 09:54 #51
Jeg er ikke ansvarlig for Eksperten lavt evt. et print !
Avatar billede margitbork Nybegynder
20. august 2004 - 09:57 #52
Jeg har også nu lavet min egen lille kopi af artiklen. - og sendt en mail til eksperten om problemet med køb af artikler.
Avatar billede margitbork Nybegynder
20. august 2004 - 10:03 #53
Nå men videre til test af SortService. Udviklingsværktøjet kender ikke noget der hedder genpakke eller
localhost.axis.services.SortService.*;

Hvor finder jeg dem ?
Avatar billede arne_v Ekspert
20. august 2004 - 10:17 #54
Det er dem du laver med wsdl2java !
Avatar billede arne_v Ekspert
20. august 2004 - 10:20 #55
genpakke hedder muligvis noget andet.
Avatar billede margitbork Nybegynder
20. august 2004 - 10:22 #56
Jeg var lige kommet til at springe det punkt over.
Avatar billede margitbork Nybegynder
20. august 2004 - 10:28 #57
Nu mangler jeg så at får lokaliseret dette
        // lookup stub
        SortService service = new SortServiceLocator();
        Sort s = service.getSortService();

hvor finder jeg SortService.class og SortServiceLocator.class ?
Avatar billede margitbork Nybegynder
20. august 2004 - 10:31 #58
Nå jeg kan godt finde dem i stifinderen, men mit tool har lidt problemer. Jeg kigger lige lidt mere på det
Avatar billede margitbork Nybegynder
20. august 2004 - 10:33 #59
Det er .java filer jeg har. Skal jeg selv compilere dem ? De skal måske så slet ikke være placeret under tomcat serveren
Avatar billede arne_v Ekspert
20. august 2004 - 10:35 #60
De skal compiles og da de skal bruges af client så bør de nok ikke ligge under Tomcat.
Avatar billede margitbork Nybegynder
20. august 2004 - 10:38 #61
Nu forstår jeg, og jeg har også fået det til at virke. Jeg havde også lige lidt problemer med at jeg fik blandet den Sort og Person jeg selv havde kodet ind i det.
Så det var altså disse der er "stub". Det er sommetider lidt svært med alle de IT-begreber.
Avatar billede margitbork Nybegynder
20. august 2004 - 11:08 #62
Er det korrekt forstået at hvis man kan få wsdd'en fra en webservice, så er det meget let at få lavet kode der kan forstå svaret fra webservicen ?
Avatar billede arne_v Ekspert
20. august 2004 - 12:47 #63
HVis du har WSDL'en (ikke WSDD'en) kan du nemt generere stub kode
(Axis kan generere Java stub, .NET kan generere C# stub etc.).

(WSDD er instruktioner til Axis om hvordan den skal lave web services)
Avatar billede arne_v Ekspert
20. august 2004 - 12:48 #64
Eksempel:

<parameter name="scope" value="application"/>

og

<parameter name="scope" value="request"/>

gør det som en god JSP programmør forventer.
Avatar billede margitbork Nybegynder
20. august 2004 - 13:16 #65
Jeg forstår ikke dit eksempel.
Men hvordan genererer man stub ud fra wsdl'en
Jeg sidder med intelliJ, kan den gøre det ?
Avatar billede arne_v Ekspert
20. august 2004 - 13:19 #66
Den her linie:

java -classpath axis.jar;commons-logging.jar;log4j-1.2.8.jar;commons-discovery.jar;wsdl4j.jar;jaxrpc.jar;saaj.jar org.apache.axis.wsdl.WSDL2Java http://localhost:8080/axis/services/SortService?wsdl

genererer en stub udfra WSDL.

Eksemplet her henter en dynamisk genereret WSDL fil, men den kan også køres
på en statisk WSDL fil man har liggende på disk.
Avatar billede margitbork Nybegynder
20. august 2004 - 13:20 #67
Tak.
Avatar billede arne_v Ekspert
20. august 2004 - 13:22 #68
Jeg bruger ikke selv IntelliJ så jeg ved ikke hvad de har.

JBuilder har indbygget Axis.
Avatar billede arne_v Ekspert
20. august 2004 - 13:23 #69
Iøvrigt findes både deployment og stub generering som ant tasks !!

(hvilket måske er relevant da jeg mener at du bruger ant)
Avatar billede margitbork Nybegynder
20. august 2004 - 13:25 #70
Ja korrekt husket, Du giver iøvrigt nogle gode råd.
Avatar billede arne_v Ekspert
20. august 2004 - 13:28 #71
Et eksempel på en build.xml til axis brug:

<project name="advserver_clientgen" default="deploy">

    <property file="../config.properties"/>

    <path id="axis.classpath">

        <fileset dir="${axis.dir}/lib">

            <include name="**/*.jar"/>

        </fileset>

    </path>

    <taskdef resource="axis-tasks.properties" classpathref="axis.classpath"/>

    <property name="src.dir" value="src"/>

    <property name="gensrc.dir" value="gensrc"/>

    <property name="bin.dir" value="bin"/>

    <property name="srvsrc.dir" value="srvsrc"/>

    <property name="srvbin.dir" value="srvbin"/>

    <property name="srv.jar" value="test.jar"/>

    <property name="wsdl.url" value="http://localhost:8080/axis/services/TestService?wsdl"/>

    <target name="build">

        <javac srcdir="${srvsrc.dir}" destdir="${srvbin.dir}"/>

        <jar destfile="${srv.jar}" basedir="${srvbin.dir}"/>

    </target>

    <target name="deploy" depends="build">

        <copy file="${srv.jar}" todir="${tomcat.dir}/webapps/axis/WEB-INF/lib"/>

        <axis-admin hostname="localhost" port="8080" xmlfile="TestService.wsdd"/>

    </target>

    <target name="stubgen" depends="deploy">

        <axis-wsdl2java output="${gensrc.dir}" url="${wsdl.url}">

            <mapping namespace="http://localhost:8080/axis/services/TestService" package="ws.stub"/>

        </axis-wsdl2java>

        <javac classpathref="axis.classpath" srcdir="${gensrc.dir}" destdir="${bin.dir}"/>


    </target>

    <target name="testbuild" depends="stubgen">

        <javac classpathref="axis.classpath" srcdir="${src.dir}" destdir="${bin.dir}"/>

    </target>

    <target name="testrun" depends="deploy,testbuild">

        <java fork="yes" classpathref="axis.classpath" classpath="${bin.dir};${xerces.dir}/xmlParserAPIs.jar;${xerces.dir}/xercesImpl.jar" classname="ws.client.TestTest"/>

    </target>

</project>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester