We fixed this. The web service and client are working now.
The .......Impl class on the client side is not needed, we found out.
Also, we had to make a few changes to some of the annotations in the
client generated code, I beleive the @WebMethod had a namespace and when
we removed it everything worked. If my memory serves me correctly and this
was
the actual change we made it looks like it might be related to what you saw
in the
SOAP messages.
Thanks for the help.
----- Original Message -----
From: "Daniel Kulp" <[email protected]>
To: <[email protected]>
Cc: "Michael" <[email protected]>
Sent: Wednesday, January 12, 2011 8:58 PM
Subject: Re: Web Service Method Returns null
>> <?xml version="1.0" encoding="utf-8"?><xsd:schema
>> xmlns:xsd="http://www.w3.org/2001/XMLSchema
>> " xmlns:tns="http://self.org/" attributeFormDefault="unqualified"
>> elementFormDefault="qualified" targetNamespace="http://self.org/">
.......
<soap:Body>
<ns2:SayHelloResponse xmlns:ns2="http://test.soa.faa.gov/">
<return>Greetings From SOA Hello World running on
Tomcat!</return>
</ns2:SayHelloResponse>
</soap:Body>
</soap:Envelope>
There's the problem. The WSDL says the "return" element should be
qualified. However, the response doesn't have it qualified. I'll be if
you
modify the WSDL to have elementFormDefault="unqualified" and regenerate the
client, it would work.
Dan
On Wednesday 12 January 2011 10:13:04 am Michael wrote:
I've created my projects since my first post so come class and interface
names are different, but we are essentially talking about the some thing
here.
To respond to your comment, my client side code does have an
implementation
of the "port type" interface. See the code below (remember the name
changes):
I'm sure that the problem is on the client side since the Tomcat console
shows the
SOAP messages for the call to the server; the sayHello( ) called message
is
mine. See
the console message text below the source code.
I also just noticed a comment in the HelloWorldPortTypeImpl class. It
says
the
class is not complete. Can you provide some info on what I need to
complete it?
Thanks
************ Client ********************
package gov.faa.soa.test;
public final class Client
{
public static void main(String args[])
{
HelloWorld hw = new HelloWorld( );
HelloWorldPortType hwpt = hw.getHelloWorldPort( );
System.out.println( hwpt.sayHello( ) );
}
}
**************************************
************ Port Type ********************
package gov.faa.soa.test;
import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
/**
* This class was generated by Apache CXF 2.3.0
* Tue Jan 11 17:56:56 EST 2011
* Generated source version: 2.3.0
*
*/
@WebService(targetNamespace = "http://test.soa.faa.gov/", name =
"HelloWorldPortType")
@XmlSeeAlso({ObjectFactory.class})
public interface HelloWorldPortType {
@WebResult(name = "return", targetNamespace =
"http://test.soa.faa.gov/")
@RequestWrapper(localName = "SayHello", targetNamespace =
"http://test.soa.faa.gov/", className = "gov.faa.soa.test.SayHello")
@WebMethod(operationName = "SayHello")
@ResponseWrapper(localName = "SayHelloResponse", targetNamespace =
"http://test.soa.faa.gov/", className =
"gov.faa.soa.test.SayHelloResponse") public java.lang.String sayHello();
}
**************************************
************ Port Type Implementation ********************
/**
* Please modify this class to meet your needs
* This class is not complete
*/
package gov.faa.soa.test;
import java.util.logging.Logger;
import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
/**
* This class was generated by Apache CXF 2.3.0
* Tue Jan 11 17:56:56 EST 2011
* Generated source version: 2.3.0
*
*/
@javax.jws.WebService(
serviceName = "HelloWorld",
portName = "HelloWorldPort",
targetNamespace = "http://test.soa.faa.gov/",
wsdlLocation =
"http://localhost:8080/TomcatSOAHelloWorld/wsdl/ihelloworld.wsdl?wsdl",
endpointInterface =
"gov.faa.soa.test.HelloWorldPortType")
public class HelloWorldPortTypeImpl implements HelloWorldPortType {
private static final Logger LOG =
Logger.getLogger(HelloWorldPortTypeImpl.class.getName());
/* (non-Javadoc)
* @see gov.faa.soa.test.HelloWorldPortType#sayHello(*
*/
public java.lang.String sayHello() {
LOG.info("Executing operation sayHello");
try {
java.lang.String _return = "_return169428188";
return _return;
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
}
**************************************
************ Tomcat Console Message ********************
Jan 11, 2011 3:36:34 PM
org.apache.cxf.interceptor.AbstractLoggingInterceptor log
INFO: Inbound Message
----------------------------
ID: 1
Address: /TomcatSOAHelloWorld/services/HelloWorldPort
Encoding: UTF-8
Content-Type: text/xml;charset="utf-8"
Headers: {content-type=[text/xml;charset="utf-8"],
connection=[keep-alive],
host =[localhost:8080],
Content-Length=[160],
SOAPAction=[""],
user-agent=[JAX-WS RI 2.1.6 in JDK 6],
Content-Type=[text/xml;charset="utf-8"],
Accept=[text/xml, multipart/related, text/html, image/gif, image/jpeg, *;
q=.2, */*; q=.2]}
Payload: <?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<SayHello xmlns="http://test.soa.faa.gov/"/>
</S:Body>
</S:Envelope>
--------------------------------------
SayHello( ) in the HelloWorld Web Service was called!
Jan 11, 2011 3:36:35 PM
org.apache.cxf.interceptor.AbstractLoggingInterceptor log
INFO: Outbound Message
---------------------------
ID: 1
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:SayHelloResponse xmlns:ns2="http://test.soa.faa.gov/">
<return>Greetings From SOA Hello World running on
Tomcat!</return>
</ns2:SayHelloResponse>
</soap:Body>
</soap:Envelope>
--------------------------------------
**************************************
----- Original Message -----
From: "Michael" <[email protected]>
To: <[email protected]>
Sent: Sunday, January 09, 2011 9:56 AM
Subject: Re: Web Service Method Returns null
> Thanks, I'll take a look at this.
>
> But, after giving this problem some thought I have another question:
>
> Does the class that implements the web service have to be a Java Bean or
> can in be a POJO?
>
> ----- Original Message -----
> From: "Freeman Fang" <[email protected]>
> To: <[email protected]>
> Sent: Sunday, January 09, 2011 7:03 AM
> Subject: Re: Web Service Method Returns null
>
>
> Hi,
>
> My comment inline
>
> On 2011-1-9, at 上午12:01, Michael wrote:
>> Recently I've posted several issues I've been having using Eclipse
>> Helios (3.6), CXF runtime (2.3.0), Tomcat (6.0) and Java
>> (1.6.0_22). As is often the case the cause of the problem was user
>> error and quite simple to remedy.
>>
>> Simply, my WSDL soap:address was pointing to my deployed WSDL
>> location not my service location. The was the cause of the content
>> type error I was getting in my client.
>>
>> I found a good description of the CXF Servlet functionality and the
>> cxf-servlet.xml and was able to provide the correct soap:address in
>> my WSDL.
>>
>> The only problem I have remaining is my web service is returning a
>> null value when it should be returning a string saying hello from
>> the web service. I'm posting some code and my WSDL below.
>>
>> Can someone take a look at this and see if you can tell me what I
>> might be doing wrong? If you need more information just let me know
>> what to post.
>>
>> package org.self;
>>
>> import javax.jws.WebService;
>>
>> @WebService(targetNamespace = "http://self.org/",
>>
>> portName = "HelloWorldWebServicePort",
>> serviceName = "HelloWorldWebServiceService")
>>
>> public class HelloWorldWebService
>> {
>> public String SayHello( )
>> {
>>
>> return "Hello World From HelloWorldWebService On Tomcat";
>
> // when you call hwwsPortType.sayHello( ), this method not get invoked.
>
>> }
>> }
>
> There should be a class implements HelloWorldWebServicePortType
> interface have sayHello method and return whatever you want to return,
> but not the one in HelloWorldWebService.
>
> Freeman
>
>> package org.self;
>>
>> public final class Client
>> {
>>
>> public static void main(String args[])
>> {
>>
>> HelloWorldWebService hwws = new HelloWorldWebService( );
>> HelloWorldWebServicePortType hwwsPortType =
>>
>> hwws.getHelloWorldWebServicePort( );
>>
>> System.out.println( hwwsPortType.sayHello( ) );
>>
>> }
>>
>> }
>>
>> <?xml version="1.0" encoding="utf-8"?><xsd:schema
>> xmlns:xsd="http://www.w3.org/2001/XMLSchema
>> " xmlns:tns="http://self.org/" attributeFormDefault="unqualified"
>> elementFormDefault="qualified" targetNamespace="http://self.org/">
>>
>> <xsd:element name="SayHello" type="tns:SayHello"/>
>> <xsd:complexType name="SayHello">
>>
>> <xsd:sequence/>
>>
>> </xsd:complexType>
>> <xsd:element name="SayHelloResponse" type="tns:SayHelloResponse"/>
>> <xsd:complexType name="SayHelloResponse">
>>
>> <xsd:sequence>
>>
>> <xsd:element minOccurs="0" name="return" type="xsd:string"/>
>>
>> </xsd:sequence>
>>
>> </xsd:complexType>
>>
>> </xsd:schema>
>>
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <wsdl:definitions name="HelloWorldWebService"
>> targetNamespace="http://self.org/
>> " xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
>> xmlns:tns="http://self.org/
>> " xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>> xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/
>> ">
>>
>> <wsdl:types>
>>
>> <schema xmlns="http://www.w3.org/2001/XMLSchema">
>> <import namespace="http://self.org/"
>> schemaLocation="helloworldwebservice_schema1.xsd"/>
>> </schema>
>>
>> </wsdl:types>
>> <wsdl:message name="SayHello">
>>
>> <wsdl:part name="parameters" element="tns:SayHello">
>> </wsdl:part>
>>
>> </wsdl:message>
>> <wsdl:message name="SayHelloResponse">
>>
>> <wsdl:part name="parameters" element="tns:SayHelloResponse">
>> </wsdl:part>
>>
>> </wsdl:message>
>> <wsdl:portType name="HelloWorldWebServicePortType">
>>
>> <wsdl:operation name="SayHello">
>>
>> <wsdl:input name="SayHello" message="tns:SayHello">
>>
>> </wsdl:input>
>>
>> <wsdl:output name="SayHelloResponse"
>>
>> message="tns:SayHelloResponse">
>>
>> </wsdl:output>
>> </wsdl:operation>
>>
>> </wsdl:portType>
>> <wsdl:binding name="HelloWorldWebServiceSoapBinding"
>>
>> type="tns:HelloWorldWebServicePortType">
>>
>> <soap:binding style="document"
>>
>> transport="http://schemas.xmlsoap.org/soap/http
>> "/>
>>
>> <wsdl:operation name="SayHello">
>>
>> <soap:operation soapAction="" style="document"/>
>> <wsdl:input name="SayHello">
>>
>> <soap:body use="literal"/>
>>
>> </wsdl:input>
>> <wsdl:output name="SayHelloResponse">
>>
>> <soap:body use="literal"/>
>>
>> </wsdl:output>
>>
>> </wsdl:operation>
>>
>> </wsdl:binding>
>> <wsdl:service name="HelloWorldWebService">
>>
>> <wsdl:port name="HelloWorldWebServicePort"
>>
>> binding="tns:HelloWorldWebServiceSoapBinding">
>>
>> <soap:address location =
>>
>> "http://localhost:8080/HelloWorldWebService/services/HelloWorldWebServic
>> ePort "/>
>>
>> </wsdl:port>
>>
>> </wsdl:service>
>>
>> </wsdl:definitions>
>
> ------------------------
>
> FuseSource: http://fusesource.com
> blog: http://freemanfang.blogspot.com
> twitter: http://twitter.com/freemanfang
> Apache Servicemix:http://servicemix.apache.org
> Apache Cxf: http://cxf.apache.org
> Apache Karaf: http://karaf.apache.org
> Apache Felix: http://felix.apache.org
--
Daniel Kulp
[email protected]
http://dankulp.com/blog