0
votes

I'm trying to create a WS, deploy it in Tomcat, inside a webapplication and use a stub to call it.

I'm using this interface as a base for the WSDL:

package com.at.iscrizio.ws.services;
public interface SalutareService {
  public String sayciao(String name);    
}

and this script to generate the wsdl file, the server and deploy files and the client-side files:

set WSDL_FILE=SalutareService.wsdl
set TO_WSDL=%AXIS2_HOME%/bin/java2wsdl.bat
set TO_JAVA=%AXIS2_HOME%/bin/wsdl2java.bat
set CLASS=com.at.iscrizio.ws.services.SalutareService
set SOAP_ADDR=http://localhost:9090/Iscrizio/services/SalutareServiceEx

call %TO_WSDL% -cp build/classes -o ./wsdl -of %WSDL_FILE% -cn %CLASS% -l %SOAP_ADDR%
call %TO_JAVA% -uri wsdl/%WSDL_FILE% -S generated -o axis -ss -sd -ssi --noWSDL
call %TO_JAVA% -uri wsdl/%WSDL_FILE% -S generated -o axis

This is my WS implementation

package com.at.iscrizio.ws.services;
public class SalutareServiceEx implements SalutareServiceSkeletonInterface {
  @Override
  public SayciaoResponse sayciao(Sayciao sayciao) {
    SayciaoResponse resp = new SayciaoResponse();
    resp.set_return("Ciao");
    return resp;
  }
}

this is my service.xml (a little bit different from the one that the standard axis build.xml generated, just to change the ServiceClass):

<?xml version="1.0" encoding="UTF-8"?>
<!-- This file was auto-generated from WSDL -->
<!-- by the Apache Axis2 version: 1.6.1  Built on : Aug 31, 2011 (12:22:40 CEST) -->
<serviceGroup>
    <service name="SalutareServiceEx">
        <messageReceivers>
            <messageReceiver mep="http://www.w3.org/ns/wsdl/in-out"     class="com.at.iscrizio.ws.services.SalutareServiceMessageReceiverInOut"/>
        </messageReceivers>
        <parameter   name="ServiceClass">com.at.iscrizio.ws.services.SalutareServiceEx</parameter>
        <parameter name="useOriginalwsdl">true</parameter>
        <parameter name="modifyUserWSDLPortAddress">true</parameter>
        <operation name="sayciao" mep="http://www.w3.org/ns/wsdl/in-out" namespace="http://services.ws.iscrizio.at.com">
            <actionMapping>urn:sayciao</actionMapping>
            <outputActionMapping>urn:sayciaoResponse</outputActionMapping>
       </operation>
    </service>
</serviceGroup>

Inside server-config.wsdd, I have:

  <handler name="Trace" type="java:com.at.iscrizio.ws.handler.TraceHandler"/>
  <service name="SalutareServiceEx" provider="java:RPC">
  <requestFlow>
    <handler type="Trace"/>
  </requestFlow>
  <parameter name="allowedMethods" value="sayciao"/>
  <parameter name="scope" value="Request"/>
  <parameter name="className" value="com.at.iscrizio.ws.services.SalutareServiceEx"/>
</service>

I'm able to see the page http://localhost:9090/Iscrizio/services/SalutareServiceEx?wsdl

We're almost at the end...With this piece of code, i'm using the stub to call the ws:

SalutareServiceStub stub = new SalutareServiceStub(); 
SalutareServiceStub.Sayciao param = new SalutareServiceStub.Sayciao();
param.setName("Antonio");
SalutareServiceStub.SayciaoResponse resp = stub.sayciao(param);
System.out.println(resp);

the request pass through my handler (the one defined inside the wsdd), I can see using the remote debug. Using TCPMon, i saw my request:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
  <soapenv:Body>
    <ns1:sayciao xmlns:ns1="http://services.ws.iscrizio.at.com">
      <ns1:name>Antonio</ns1:name>
    </ns1:sayciao>
  </soapenv:Body>
</soapenv:Envelope>

and the ws response:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"     xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-    instance">
<soapenv:Body>
  <soapenv:Fault>
    <soapenv:Code>
      <soapenv:Value>soapenv:Sender</soapenv:Value>
        <soapenv:Subcode xmlns:ns1="http://www.w3.org/2003/05/soap-rpc">
          <soapenv:Value>ns1:BadArguments</soapenv:Value>
        </soapenv:Subcode>
    </soapenv:Code>
    <soapenv:Reason>
      <soapenv:Text xml:lang="en">string</soapenv:Text>
    </soapenv:Reason>
    <soapenv:Detail>
      <ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">anto-note</ns2:hostname>
    </soapenv:Detail>
  </soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>

This is the stack trace:

Exception in thread "main" org.apache.axis2.AxisFault: string
    at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:531)
    at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:375)
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:421)
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
    at com.at.iscrizio.ws.services.SalutareServiceStub.sayciao(SalutareServiceStub.java:185)
    at com.at.iscrizio.ws.client.TestClient.main(TestClient.java:25)

Where is the problem? Excuse me for the huge post, thanks to all

1
You tried calling your service using soapui? That would tell you if your problem is your client or your server sidedavidfrancis
Just tried, this is the node inside the soap:Body: <ser:sayciao><ser:args0>antonio</ser:args0></ser:sayciao> Same response from the WS.Antonio

1 Answers

0
votes

At least you know that it's the server end that had the problem. The req that soapui is generating is different from your orig req? Sounds strange but soapui is usually right. Personally I would debug the server end and try to figure out where it's going wrong eg set some exception breakpoints