Avatar billede firecow Nybegynder
16. december 2008 - 10:48 Der er 8 kommentarer og
1 løsning

Axis consuming .Net Webservice

Goddav..
Jeg har en lavet en Java Applikation der skal tilgå en .net Webservice. Men kan ikke helt få det til at virke.
Webservicen jeg skal tilgå ser således ud.

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <CreateUserAndEmailPass xmlns="http://???.???.???.???/?????????/???/">
      <email>string</email>
      <firstName>string</firstName>
      <lastName>string</lastName>
      <countryID>int</countryID>
      <phone>string</phone>
    </CreateUserAndEmailPass>
  </soap12:Body>
</soap12:Envelope>

Min Java metode ser således ud. Jeg bruger Axis til at tilgå servicen.

public boolean createUser(String email, String firstName, String lastName, String phone)
{
  boolean result = false;
   
  functionName = "CreateUserAndEmailPass";
  soapAction = qName + functionName;
   
  call.setOperationName(new QName(qName, functionName));
  call.setReturnType(XMLType.XSD_BOOLEAN);
  call.setReturnClass(Boolean.class);
  call.addParameter(new QName(qName,"email"), XMLType.XSD_STRING, ParameterMode.IN);
  call.addParameter(new QName(qName,"firstName"), XMLType.XSD_STRING, ParameterMode.IN);
  call.addParameter(new QName(qName,"lastName"), XMLType.XSD_STRING, ParameterMode.IN);
  call.addParameter(new QName(qName,"countryID"), XMLType.XSD_INT, ParameterMode.IN);
  call.addParameter(new QName(qName,"phone"), XMLType.XSD_STRING, ParameterMode.IN);
  call.setSOAPActionURI(soapAction);
   
  try {
    result = (Boolean) call.invoke(
      new Object[] {
    email,
    firstName,
    lastName,
    /** TODO CountryID bliver hardcoded **/
    187,
    phone
      }
      );
    } catch (Exception e) {
    e.printStackTrace();
    System.err.println(e.toString());
  }               
  return result;
}

Men Webservicen melder denne exception, når jeg prøver at tilgå den.

AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Client
faultSubcode:
faultString: Server was unable to read request. ---&gt; There is an error in XML document (1, 584). ---&gt; Input string was not in a correct format.
faultActor:
faultNode:
faultDetail:
    {http://xml.apache.org/axis/}stackTrace:Server was unable to read request. ---&gt; There is an error in XML document (1, 584). ---&gt; Input string was not in a correct format.
    at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
    at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
    at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
    at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
    at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
    at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
    at org.apache.axis.client.Call.invoke(Call.java:2767)
    at org.apache.axis.client.Call.invoke(Call.java:2443)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)
    at webservice.Webservice.createUser(Webservice.java:56)
    at gui.whiteGui.GuiController.init(GuiController.java:84)
    at core.Controller.&lt;init&gt;(Controller.java:122)
    at MainApplet.init(MainApplet.java:41)
    at sun.applet.AppletPanel.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Bruger jeg derimod XSD_STRING på countryID, melder den ingen fejl og virker som den skal. Er der nogle der har en fornuftig forklaring på dette. Det er første gang jeg bruger Axis, så har sikkert lavet en brainfart et eller andet sted :D
Avatar billede arne_v Ekspert
16. december 2008 - 15:12 #1
Hvis du er expert i WSDL og SOAP, saa er den maade at bruge Axis paa helt fin.

Os almindelige doedelige koerer WSDL2Java utility som genererer en Java
klasse udfra WSDL og saa kalder vi bare den Java klasse og lader dermes
Axis tage sig af alt det vanskelige !
Avatar billede firecow Nybegynder
16. december 2008 - 15:22 #2
:D Jeg er på ingen måde expert i WSDL eller SOAP.
Har godt nok set det kan lade sig gøre, men har endnu ikke fundet nogle gode eksempler der illusterer det, så jeg kan forstå det. Har du et eksempel liggende jeg kan kigge lidt på ?

Tak for det hurtige svar btw...
Avatar billede arne_v Ekspert
16. december 2008 - 15:38 #3
Det er lige ud af landevejen.

I Eclipse eller NetBeans har du en lille wizard som kan goere det (Eclipse bruger Axis, jeg ved
faktisk ikke hvad NetBeans bruger).

Det er supernemt i ant:

    <path id="axis.classpath">
        <fileset dir="${axis.dir}/lib">
            <include name="**/*.jar"/>
        </fileset>
    </path>
    <taskdef resource="axis-tasks.properties" classpathref="axis.classpath"/>
...

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

Det kan laves i en BAT fil:

set AXISLIBS=\Jakarta\Axis-1_1\lib\axis.jar;\Jakarta\Axis-1_1\lib\commons-logging.jar;\Jakarta\Axis-1_1\lib\log4j-1.2.8.jar;\Jakarta\Axis-1_1\lib\commons-discovery.jar;\Jakarta\Axis-1_1\lib\wsdl4j.jar;\Jakarta\Axis-1_1\lib\jaxrpc.jar;\Jakarta\Axis-1_1\lib\saaj.jar
java -classpath %AXISLIBS% org.apache.axis.wsdl.WSDL2Java http://localhost/Foobar.asmx?WSDL
Avatar billede arne_v Ekspert
16. december 2008 - 15:39 #4
Gammelt eksempel - derfor Axis 1.1 - du skal naturligvis bruge en nyere.
Avatar billede firecow Nybegynder
16. december 2008 - 15:46 #5
Det lyder sku' da næsten for godt til at være sandt...

Nu er jeg godt nok ikke så meget inde i Eclipse, selvom det er det jeg udvikler mit program i.

Hvad dælen er ANT ?
Avatar billede arne_v Ekspert
16. december 2008 - 16:00 #6
I Eclipse skal du have WTP installeret.

new
web service
web service client
angiv URL paa WSDL
etc.

----

Ant er et meget anvendt build tool.
Avatar billede firecow Nybegynder
17. december 2008 - 12:30 #7
Tusind tak for det :D Det var jo møj nemt :D

Jeg går udfra det er den rigtige måde jeg tilgår de autogenerede klasser på.

UserServiceSoapProxy proxy = new UserServiceSoapProxy();
proxy.setEndpoint("http://???.???.???.???/UserService.asmx");
String response = proxy.login(username, password);
Avatar billede arne_v Ekspert
17. december 2008 - 15:00 #8
Det ser rigtigt ud.

Jeg synes dog at man plejer at skulle bruge en factory klasse og metode. Men virker
din kode saa virker den jo.

Default endpoint skulle ogsaa gerne vaere OK uden at du behoever at saette det.
Avatar billede arne_v Ekspert
17. december 2008 - 15:01 #9
Men web service er nemt, hvis man lader tools'ene tage sig af alt det besvaerlige.

Og et svar.
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