2016-05-06 19 views
0

Ich folgte eine client und server Tutorial, um einen einfachen Client-Server Web-Service, der einfache Zugabe von zwei int führt. Alle meine Klassen werden automatisch von Intelliji generiert.Axis IllegalArgumentException, aber Soap-Nachricht ist korrekt

Wenn ich die Client-Seite laufen, erhalte ich:

AxisFault 
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException 
faultSubcode: 
faultString: Tried to invoke method public int calculator.Calculator.add(int,int) with arguments java.lang.Integer,null. The arguments do not match the signature.; nested exception is: 
    java.lang.IllegalArgumentException 
faultActor: 
faultNode: 
faultDetail: 
    {http://xml.apache.org/axis/}hostname:unknown 

Aber die SOAP-Anforderung korrekt ist:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
     <a xmlns="http://calculator">1</a> 
     <b xmlns="http://calculator">7</b> 
    </soapenv:Body> 
</soapenv:Envelope> 

Hier ist meine Calculator Klasse:

package calculator; 

import javax.jws.WebMethod; 
import javax.jws.WebService; 

@WebService 
public class Calculator { 

    @WebMethod 
    public int add(int a, int b) { 
     return a + b; 
    } 

} 

Alle Code wird von Intelliji-integrierten Funktionen wie Generate WSDL from Java Code undgeneriert. Hier

ist der Client-Testcode:

package calculator; 

import javax.xml.rpc.ServiceException; 
import java.rmi.RemoteException; 

public class Test { 

    public static void main(String[] args) { 

     CalculatorService serviceLocator = new CalculatorServiceLocator(); 

     Calculator_PortType service = null; 
     try { 
      service = serviceLocator.getCalculator(); 
     } catch (ServiceException e) { 
      e.printStackTrace(); 
      throw new RuntimeException("Something went wrong"); 
     } 

     try { 
      int add = service.add(1,7); 
      System.out.println("add: " + add); 

     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Hier ist die WSDL:

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions targetNamespace="http://calculator" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://calculator" xmlns:intf="http://calculator" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<!--WSDL created by Apache Axis version: 1.4 
Built on Apr 22, 2006 (06:55:48 PDT)--> 
<wsdl:types> 
    <schema elementFormDefault="qualified" targetNamespace="http://calculator" xmlns="http://www.w3.org/2001/XMLSchema"> 
    <element name="a" type="xsd:int"/> 
    <element name="b" type="xsd:int"/> 
    <element name="addReturn" type="xsd:int"/> 
    </schema> 
</wsdl:types> 
    <wsdl:message name="addResponse"> 
     <wsdl:part element="impl:addReturn" name="addReturn"/> 
    </wsdl:message> 
    <wsdl:message name="addRequest"> 
     <wsdl:part element="impl:a" name="a"/> 
     <wsdl:part element="impl:b" name="b"/> 
    </wsdl:message> 
    <wsdl:portType name="Calculator"> 
     <wsdl:operation name="add" parameterOrder="a b"> 
     <wsdl:input message="impl:addRequest" name="addRequest"/> 
     <wsdl:output message="impl:addResponse" name="addResponse"/> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="CalculatorSoapBinding" type="impl:Calculator"> 
     <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
     <wsdl:operation name="add"> 
     <wsdlsoap:operation soapAction=""/> 
     <wsdl:input name="addRequest"> 
      <wsdlsoap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output name="addResponse"> 
      <wsdlsoap:body use="literal"/> 
     </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="CalculatorService"> 
     <wsdl:port binding="impl:CalculatorSoapBinding" name="Calculator"> 
     <wsdlsoap:address location="http://localhost:8080/services/Calculator"/> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Die SOAP-Anforderung ist richtig. Ich habe ein Hello World-Beispiel, das gut funktioniert. Alles scheint richtig zu sein. Ich habe keine Standardeinstellungen geändert.

+0

Vielleicht fügen Sie auch die WSDL. –

+0

Nur hinzugefügt :) – user5365075

+0

Es könnte ein Problem sein, Serializer/Deserializer nicht richtig eingestellt oder deklariert? Es wäre merkwürdig, dass Axis die Option String in Ordnung behandelt, aber nicht Integer behandelt ... – user5365075

Antwort

1

Wenn Sie die Klasse (1) bereitstellen und die WSDL-Datei (2) generieren, stellen Sie sicher, dass Sie wrapped style anstelle von document verwenden.

Verwandte Themen