2016-05-06 2 views
0

Я следил за инструкциями client и server, чтобы создать простой клиент-сервер Calculator веб-сервис, который выполняет простое добавление двух int. Все мои классы автоматически генерируются Intelliji.Axis IllegalArgumentException, но сообщение с мылом верное

Когда я запускаю на стороне клиента, я получаю:

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

} 

Весь код генерируется встроенными функциями Intelliji, такими как Generate WSDL from Java Code и Generate Java Code from WSDL.

Вот тестовый код клиента:

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) убедитесь, что вы используете стиль wrapped вместо document.

Смежные вопросы