user5365075
user5365075

Reputation: 2279

Axis IllegalArgumentException but soap message is correct

I followed a client and server tutorial to create a simple client-server Calculator web service that performs simple addition of two int. All my classes are automatically generated by Intelliji.

When I run the client side, I get:

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

But the SOAP request is correct:

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

Here is my Calculator class:

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

}

All code is generated by Intelliji built-in functions such as Generate WSDL from Java Code and Generate Java Code from WSDL.

Here is the client test code:

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

Here is the 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>

The SOAP request is correct. I have a Hello World example that works fine. Everything seems right. I haven't changed any default settings.

Upvotes: 0

Views: 1401

Answers (1)

user5365075
user5365075

Reputation: 2279

When exposing the class (1) and generating the WSDL file (2), make sure you use wrapped style instead of document.

Upvotes: 1

Related Questions