2016-05-06 10 views
0

clientserverのチュートリアルに続いて、2つのintを単純に追加する単純なクライアント/サーバーCalculator Webサービスを作成しました。すべてのクラスはIntellijiによって自動的に生成されます。Axis IllegalArgumentExceptionですが、SOAPメッセージが正しい

私はクライアント側を実行すると、私が手:

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 

しかし、SOAPリクエストは正しいです:ここでは

<?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> 

は私Calculatorクラスです:

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; 
    } 

} 

すべてのコードGenerate WSDL from Java CodeおよびなどのIntelliji組み込み関数によって生成されます3210。ここで

は、クライアントのテストコードです:ここで

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(); 
     } 
    } 
} 

は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> 

SOAPリクエストが正しいです。私はうまく動作するHello Worldの例があります。すべてが正しいようです。私はデフォルト設定を変更していません。

+0

おそらくWSDLも貼り付けます。 –

+0

ちょうどそれを追加しました:) – user5365075

+0

シリアライザ/デシリアライザの問題が正しく設定または宣言されていない可能性がありますか? AxisがデフォルトでStringを細かく処理するのは不思議ですが、Integerは処理しません... – user5365075

答えて

1

クラス(1)を公開してWSDLファイル(2)を生成するときは、documentの代わりにwrappedスタイルを使用してください。

関連する問題