Avatar billede martinm Nybegynder
22. april 2003 - 19:08 Der er 33 kommentarer og
1 løsning

Apache Axis

Hej,

Jeg har følgende klasse, som benyttes til at kalde en .NET WS.
import .......

public class Main2 {
    public static void main( String[] args ) {
        String endpoint = "http://localhost:8080/service/service1.asmx";

        Service service =
                null;
        service = new Service(); //new Service("http://localhost:8080/service/service1.asmx?WSDL", new QName( "http://xp/abc/", "Service1" ) );

        Call call = null;

        //service.createCall();
        try {
            call = ( Call ) service.createCall();//( Call ) service.createCall(new QName("Service1Soap"), "ListWebSites");
        }
        catch ( ServiceException e ) {
            e.printStackTrace();  //To change body of catch statement use Options | File Templates.
        }

        try {
            call.setTargetEndpointAddress( new java.net.URL( endpoint ) );
        }
        catch ( MalformedURLException e ) {
            e.printStackTrace();  //To change body of catch statement use Options | File Templates.
        }

        call.setOperationName( "ListWebSites" );
        call.setSOAPActionURI( "http://xp/abc/ListWebSites" );
        call.setReturnType( XMLType.XSD_STRING );
        call.setUsername( "xxxx" );
        call.setPassword( "123456" );
        System.out.println( "EncodingStyle: " + call.getEncodingStyle() );

        try {
            Object ret = ( Object ) call.invoke( new Object[]{""} );

            System.out.println( "Got result : " + ret );
        }
        catch ( RemoteException e ) {
              e.printStackTrace();  //To change body of catch statement use Options | File Templates.
        }

    }
}

men får:

- Exception:
org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.
    at org.apache.axis.encoding.ser.SimpleDeserializer.onStartChild(SimpleDeserializer.java:188)
    at org.apache.axis.encoding.DeserializationContextImpl.startElement(DeserializationContextImpl.java:893)
    at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:200)
    at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:684)
    at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:241)
    at org.apache.axis.message.RPCElement.getParams(RPCElement.java:265)
    at org.apache.axis.client.Call.invoke(Call.java:1871)
    at org.apache.axis.client.Call.invoke(Call.java:1777)
    at org.apache.axis.client.Call.invoke(Call.java:1315)
    at Main2.main(Main2.java:56)

Jeg kan ved hjælp af en 'sniffer' se, at metoden bliver kaldt korrekt og at den korrekte xml bliver sendt tilbage af WS, men min applikation kan ikke forholde sig til denne data.

Hvad kan jeg gøre?
Avatar billede martinm Nybegynder
22. april 2003 - 19:10 #1
Hov. Bemærk, at alt med QName er udkommenteret!
Avatar billede arne_v Ekspert
22. april 2003 - 21:30 #2
Det ligner altså mere det gamle Apache SOAP Toolkit end
Apache Axis Toolkit !?
Avatar billede martinm Nybegynder
22. april 2003 - 22:13 #3
Call, Service og XMLType er da axis klasser.

Jeg henter følgende:

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.rpc.ServiceException;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
Avatar billede arne_v Ekspert
22. april 2003 - 22:17 #4
Der står jo også Axis i stack tracen i dit spørgsmål.

Men når jeg genererer client kode med Axis, så ser
interfacet helt anderledes og simplere ud.
Avatar billede martinm Nybegynder
22. april 2003 - 22:40 #5
Hvordan vil du lave koden, så den er simplere?
Jeg har ikke fået noget genereret, idet jeg selv har skrevet hver en linje.
Jeg har også set eksempler, hvor en url fra wsdl'en er inddraget, men er det nødvendigt?
Avatar billede arne_v Ekspert
23. april 2003 - 07:32 #6
Axis kommer med et tool (wsdl2java hvis jeg husker rigtigt)
der bl.a. kan generere client stub kode.

Med det kan man normalt nøjes med ned til 2 linier:

ServiceXxxxSoap binding = (new ServiceXxxxLOcator()).getServiceXxxxSoap();
Z z = binding.getZ();

(hvis du kender RMI så fungerer det meget på samme måde, man
binder og så kalder man en lokal metode i noget genererer
kode der laver alt det hårde arbejde)
Avatar billede martinm Nybegynder
23. april 2003 - 10:58 #7
Jeg har nu prøvet WSDL2Java - den generere også fint alle de klasser den skal, men stub-klassen er fyldt med fejl. Compileren ser sort (men den generere jo også en WS og ikke en klient til kommunikation med en WS)! Den smule kode jeg har burde da kunne modtage xml-strengen fra .NET WS'en og assigne den til en streng?
Avatar billede arne_v Ekspert
23. april 2003 - 11:10 #8
WSDL2Java kanbåd egenerere server og client kode.

Du skal naturligvis bruge client kode.

Mit gæt vil være at compile fejlene skyldes classpath.

Du skal have sat classpath til en 6-7 jar-filer i Axis kittet.Men du har naturligvis ret - det manuelle approach burde også virke.

Jeg kan bare ikke gennemskue det umiddlebart. Og generelt synes
jeg at det er dårligt i forhold til future maintenance at gøre det
mere komplekst end nødvendigt.
Avatar billede martinm Nybegynder
24. april 2003 - 17:30 #9
Jeg har alle .jar-filer med i min classpath - IntelliJ markerer det stadig med rødt :-(...

Jeg har fået hul igennem nu vha. den manuelle metode, men nu driller parsing af xml'en..

Fra min .NET WS returneres alt XML'en som en lang streng, men når den modtages parses den ikke korrekt. Der er en del &-tegn?, hvor der ikke bør være det!
Avatar billede arne_v Ekspert
24. april 2003 - 17:34 #10
Hvis tingene er i classparth burde det jo virke !

Er det ikke bare "&lt;" i.s.f. "<" etc. ?
Avatar billede magoo20000 Nybegynder
24. april 2003 - 20:53 #11
Jo det er det!
Avatar billede arne_v Ekspert
24. april 2003 - 20:57 #12
magoo>

Kender du Martin ?

(siden du ved hvordan hans SOAP message ser ud)
Avatar billede magoo20000 Nybegynder
24. april 2003 - 20:59 #13
Yep! Det er min fætter - han har haft lidt bøvl med .NET(er lige blevet sat ind i det af ham). Problemet er parsingen af den streng(som indeholder xml), som bliver modtaget af en java app(Apache Axis). Den indeholder de her tegn og vil ikke validere op imod hans XSD.
Avatar billede arne_v Ekspert
24. april 2003 - 21:08 #14
Så d.v.s. at vi har noget som ville være korrekt, hvis
bare vi kan få konverteret "&lt;" til "<" etc. ?
Avatar billede arne_v Ekspert
24. april 2003 - 21:10 #15
Muligvis vil noget så simpelt som:

s.replaceAll(&lt;", "<");
s.replaceAll(&gt;", ">");
s.replaceAll(&amp;", "&");

kunne løse det så.
Avatar billede magoo20000 Nybegynder
24. april 2003 - 21:12 #16
Ja, tekststrengen, som bliver modtaget på Java-siden er korrekt, men når man vha. IDocument-klassen fra BEA sender denne streng som parameter ind i constructoren og derved laver et objekt, der repæsenterer et XML-doc, og derefter kalder toXML() til dette objekt fremkommer disse tegn. Er det encodingen mon?
Avatar billede arne_v Ekspert
24. april 2003 - 21:16 #17
.NET ---> Axis ---> java kode

virker korrekt, men

java kode ---> BEA -|
      <------------|

har problemer ?
Avatar billede arne_v Ekspert
24. april 2003 - 21:16 #18
Det lyder nærmest som om BEA koden ikke er klar over at det er XML
den modtager og derfor encoder alt XML markup !
Avatar billede arne_v Ekspert
24. april 2003 - 21:19 #19
Hvis det er den her:
  http://edocs.bea.com/wli/docs70/classdocs/com/bea/document/IDocument.html
så er det jo kun et interface, så constructor må være noget andet !?
Avatar billede magoo20000 Nybegynder
24. april 2003 - 21:20 #20
Jeg gav en dårlig forklaring. Jeg har fået klassen:
....
try {
            String ret = ( String ) call.invoke( o );
            System.out.println( "Pure: "+ret ); <---En lang streng
            IDocument callDoc = DocumentFactory.createDocument( ret );
            String s = callDoc.toXML();
            System.out.println( "After toXML() " + "\n" + s ); <---- Her kommer de 'underlige' tegn
        }
        catch ( RemoteException e ) {
            e.printStackTrace();
        }
......

Hvorfor kommer disse tegn blot ved at lave en instans af IDocument?
Avatar billede magoo20000 Nybegynder
24. april 2003 - 21:21 #21
Fik det kun forklaret - det er den statiske metode createDocument(String s).
Avatar billede magoo20000 Nybegynder
24. april 2003 - 21:23 #22
.NET komponenten returnerer XML dokumentet som en lang sreng vha.
..
Return result.DocumentElement.OuterXml
...
result er et XmlDocument i .NET
Avatar billede arne_v Ekspert
24. april 2003 - 21:25 #23
Min hypotese er at DocumentFactory ikke er klar over at det allerede
er XML og derfor vil lave

<x>y</x>

til

<data>&lt;x&gt;y&lt;/x&gt;</data>
Avatar billede arne_v Ekspert
24. april 2003 - 21:27 #24
I parentes bemærket har:
  http://edocs.bea.com/wli/docs70/classdocs/com/bea/document/XMLUtils.html
en decodeXML metode som nok kunne fjerne det meste snavs:
  s = XMLUtils.decodeXML(s);
Avatar billede magoo20000 Nybegynder
24. april 2003 - 21:27 #25
Ja måske.. Jeg ved han arbejder med det nu.. Får ham til tastaturet i morgen formiddag - han har alt deployet på sin maskine og har alle klasserne osv.
Jeg takker og lade Martin overtage i morgen!
Avatar billede arne_v Ekspert
24. april 2003 - 21:28 #26
Men iøvrigt ser kode jo korrekt nok ud ifølge:
  http://edocs.bea.com/wli/docs70/classdocs/com/bea/document/DocumentFactory.html#createDocument(java.lang.String)
Avatar billede martinm Nybegynder
25. april 2003 - 19:06 #27
Godt svar! XMLUtils løser problemet! Hvad mener du om ideen, at .NET komponenten returnerer "Return result.DocumentElement.OuterXml"
(result er et XmlDocument i .NET). Klassen laver først et XML dokument og sender det derefter som en lang streng til Java klienten, som igen laver det om til et objekt, der repræsenterer en XML dokument?

JNBridge Pro var et værktøj, som jeg faldt over her i dag... Lyder ret spændende! Du kan søge på Google, hvis du vil, efter det.
Avatar billede arne_v Ekspert
25. april 2003 - 19:10 #28
Tja.

objekt->XML->objekt koster jo nok lidt CPU kraft.

Men CPU kraft er billig idag.

Og hvad skal man ellers bruge når man skal have integreret .NET og J2EE ??
Avatar billede arne_v Ekspert
25. april 2003 - 19:13 #29
Jeg har læst om JNBridge på TSS.
Avatar billede martinm Nybegynder
25. april 2003 - 19:13 #30
Ja, hvad ellers? Læg et svar, så jeg kan belønne dig for din indsats!
Avatar billede martinm Nybegynder
25. april 2003 - 19:17 #31
Hvad mener du om det?
Avatar billede arne_v Ekspert
25. april 2003 - 19:20 #32
svar
Avatar billede martinm Nybegynder
25. april 2003 - 19:21 #33
Værsgo'
Avatar billede arne_v Ekspert
25. april 2003 - 19:23 #34
Tja.

Det er jo tydeligvis til mere tæt koblede systemer end man typisk
forbinder med web services.

Og så var det indtryk (udfra artiklen på TSS), at det var mere
.NET->Java end det var Java->.NET !

Ellers mener jeg ikke noget om det.

Sådan noget skal prøves inden man ved om det er godt eller skidt.
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