You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Benson Margulies <bi...@basistech.com> on 2007/11/23 18:29:57 UTC

Diagnosis of stupid JAXB/JAXWS errors

Consider the following pile of snails. Now, I realize, I don't need them
in CXF, but I had coded them to test something. Except, that, I'd
neglected to code the @WebResult at all, so while I had a wrapper, there
was no way for the code to know the element to use for the response.

It didn't work, of course. It also didn't diagnose in the log. Should
this sort of thing produce some whining?

   @RequestWrapper(className =
"org.apache.cxf.javascript.fortest.BasicTypeFunctionReturnStringWrapper"
)
    @ResponseWrapper(className =
"org.apache.cxf.javascript.fortest.StringWrapper")
    @WebResult(name = "returnValue", targetNamespace =
"uri:org.apache.cxf.javascript.testns")

Re: Diagnosis of stupid JAXB/JAXWS errors

Posted by Jim Ma <em...@iona.com>.
Paste this Jira  for you :

----------------------------------------------------
I am using the java-first approach with spring configuration on cxf 
2.0.3 and tomcat 5.5. I specified namespace for all the input and output 
parameters via @WebParam and @WebResult annotation. But the namespace 
was somehow missing from the SOAP message.

You can reproduce the problem by using the following test code (server 
side):

=================web.xml========================================
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/beans.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 

</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
--------------------------------------------------------------------------------------------------------------- 

=================beans.xml=======================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:cxf="http://cxf.apache.org/core"
xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
    <bean id="logInbound" 
class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
    <bean id="logOutbound" 
class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
    <cxf:bus>
        <cxf:inInterceptors> <ref bean="logInbound"/> </cxf:inInterceptors>
        <cxf:outInterceptors> <ref bean="logOutbound"/> 
</cxf:outInterceptors>
        <cxf:inFaultInterceptors> <ref bean="logOutbound"/> 
</cxf:inFaultInterceptors>
    </cxf:bus>
    <jaxws:endpoint id="helloWorld" 
implementor="demo.spring.HelloWorldImpl" address="/HelloWorld" />
</beans>
----------------------------------------------------------------------------------------------------------------------- 

=================HelloWorld.java=======================================
package demo.spring;

import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.xml.ws.ResponseWrapper;
import javax.xml.ws.RequestWrapper;
import javax.jws.soap.SOAPBinding;

@WebService(name="MyHelloWorldService", 
targetNamespace="http://nstest.helloworld")
@SOAPBinding( parameterStyle=SOAPBinding.ParameterStyle.WRAPPED,
style=SOAPBinding.Style.DOCUMENT,
use= SOAPBinding.Use.LITERAL )
public interface HelloWorld {
@WebMethod
@WebResult(name="MyResult", targetNamespace="http://nstest.helloworld")
    String sayHi(@WebParam(name="MyInput", 
targetNamespace="http://nstest.helloworld") String text);
}
----------------------------------------------------------------------------------------------------------------------- 

=================HelloWorldImpl.java=======================================
package demo.spring;

import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService(endpointInterface = "demo.spring.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
    public String sayHi(String text) {
        return "Hello " + text;
    }
}
----------------------------------------------------------------------------------------------------------------------- 


Create WAR from the above code, deploy to tomcat, here is the WSDL I got 
from http://localhost:8080/...::

=======main WSDL: 
http://localhost:8080/spring_http/HelloWorld?wsdl=================
<?xml version="1.0" encoding="utf-8" ?>
- <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:ns1="http://nstest.helloworld" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:tns="http://spring.demo/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
name="HelloWorldImplService" targetNamespace="http://spring.demo/">
  <wsdl:import 
location="http://localhost:8080/spring_http/HelloWorld?wsdl=MyHelloWorldService.wsdl" 
namespace="http://nstest.helloworld" />
- <wsdl:binding name="HelloWorldImplServiceSoapBinding" 
type="ns1:MyHelloWorldService">
  <soap:binding style="document" 
transport="http://schemas.xmlsoap.org/soap/http" />
- <wsdl:operation name="sayHi">
  <soap:operation soapAction="" style="document" />
- <wsdl:input name="sayHi">
  <soap:body use="literal" />
  </wsdl:input>
- <wsdl:output name="sayHiResponse">
  <soap:body use="literal" />
  </wsdl:output>
  </wsdl:operation>
  </wsdl:binding>
- <wsdl:service name="HelloWorldImplService">
- <wsdl:port binding="tns:HelloWorldImplServiceSoapBinding" 
name="HelloWorldImplPort">
  <soap:address location="http://localhost:8080/spring_http/HelloWorld" />
  </wsdl:port>
  </wsdl:service>
  </wsdl:definitions>
----------------------------------------------------------------------------------------------------------------------------------------------- 

=====imported WSDL: 
http://localhost:8080/spring_http/HelloWorld?wsdl=MyHelloWorldService.wsdl==== 

<?xml version="1.0" encoding="utf-8" ?>
- <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:ns1="http://nstest.helloworld" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="MyHelloWorldService" 
targetNamespace="http://nstest.helloworld">
- <wsdl:types>
- <xsd:schema xmlns="http://nstest.helloworld" 
xmlns:tns="http://spring.demo/" attributeFormDefault="unqualified" 
elementFormDefault="unqualified" 
targetNamespace="http://nstest.helloworld" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <import xmlns="http://www.w3.org/2001/XMLSchema" 
namespace="http://spring.demo/" />
  <xsd:element name="sayHi" type="sayHi" />
- <xsd:complexType name="sayHi">
- <xsd:sequence>
  <xsd:element minOccurs="0" name="MyInput" type="xsd:string" />
  </xsd:sequence>
  </xsd:complexType>
  <xsd:element name="sayHiResponse" type="sayHiResponse" />
- <xsd:complexType name="sayHiResponse">
- <xsd:sequence>
  <xsd:element minOccurs="0" name="MyResult" type="xsd:string" />
  </xsd:sequence>
  </xsd:complexType>
  </xsd:schema>
  </wsdl:types>
- <wsdl:message name="sayHi">
  <wsdl:part element="ns1:sayHi" name="parameters" />
  </wsdl:message>
- <wsdl:message name="sayHiResponse">
  <wsdl:part element="ns1:sayHiResponse" name="parameters" />
  </wsdl:message>
- <wsdl:portType name="MyHelloWorldService">
- <wsdl:operation name="sayHi">
  <wsdl:input message="ns1:sayHi" name="sayHi" />
  <wsdl:output message="ns1:sayHiResponse" name="sayHiResponse" />
  </wsdl:operation>
  </wsdl:portType>
  </wsdl:definitions>
------------------------------------------------------------------------------------------------------------------------------------------- 


Create client from WSDL by using wsdl2java. The namespaces of 
input/output parameters have already been missing from the generated 
service interface:
================MyHelloWorldService.java (generated by 
wsdl2java)======================
package helloworld.nstest;

import javax.jws.WebParam.Mode;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.soap.SOAPBinding;
import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

/**
 * This class was generated by Apache CXF (incubator) 2.0.3-incubator
 * Tue Nov 20 22:45:47 EST 2007
 * Generated source version: 2.0.3-incubator
 *
 */

@WebService(targetNamespace = "http://nstest.helloworld", name = 
"MyHelloWorldService")

public interface MyHelloWorldService {

    @ResponseWrapper(targetNamespace = "http://nstest.helloworld", 
className = "helloworld.nstest.SayHiResponse", localName = "sayHiResponse")
    @RequestWrapper(targetNamespace = "http://nstest.helloworld", 
className = "helloworld.nstest.SayHi", localName = "sayHi")
    @WebResult(targetNamespace = "", name = "MyResult")
    @WebMethod
    public java.lang.String sayHi(
        @WebParam(targetNamespace = "", name = "MyInput")
        java.lang.String myInput
    );
}
===================================================================

Modify the generated client:
========MyHelloWorldService_HelloWorldImplPort_Client.java (generated by 
wsdl2java)======
package helloworld.nstest;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import demo.spring.HelloWorldImplService;
import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

public final class MyHelloWorldService_HelloWorldImplPort_Client {
    private static final QName SERVICE_NAME = new 
QName("http://spring.demo/", "HelloWorldImplService");
    private MyHelloWorldService_HelloWorldImplPort_Client() {
    }
    public static void main(String args[]) throws Exception {
      
        HelloWorldImplService ss = new HelloWorldImplService();
        MyHelloWorldService port = ss.getHelloWorldImplPort();
        {
        System.out.println("Invoking sayHi...");
        java.lang.String _sayHi_myInput = "ABC";
        java.lang.String _sayHi__return = port.sayHi(_sayHi_myInput);
        System.out.println("sayHi.result=" + _sayHi__return);
        }
        System.exit(0);
    }
}
-------------------------------------------------------------------------------------------------------- 


SOAP message captured on server-side:
--------------------------------------
Encoding: UTF-8
Headers: {connection=[keep-alive], cache-control=[no-cache], 
host=[localhost:808
0], user-agent=[Java/1.5.0_12], transfer-encoding=[chunked], 
pragma=[no-cache],
content-type=[text/xml; charset=UTF-8], accept=[*], soapaction=[""]}
Message:
<soap:Envelope 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body
 ><ns2:sayHi 
xmlns:ns2="http://nstest.helloworld"><MyInput>ABC</MyInput></ns2:say
Hi></soap:Body></soap:Envelope>
--------------------------------------
Nov 20, 2007 10:51:13 PM 
org.apache.cxf.interceptor.LoggingOutInterceptor$Loggin
gCallback onClose
INFO: Outbound Message:
--------------------------------------
<soap:Envelope 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body
 ><ns1:sayHiResponse 
xmlns:ns1="http://nstest.helloworld"><MyResult>Hello ABC</My
Result></ns1:sayHiResponse></soap:Body></soap:Envelope>------------------------- 

-------------

You can see that both "MyInput" and "MyResult" have no namespace.

Benson Margulies wrote:
> I can't tell you until tomorrow. Comcast can't route to
> issues.apache.org tonight, and I just disconnected from the complex
> alternative path I was using just now. 
>
>   
>> -----Original Message-----
>> From: Jim Ma [mailto:ema@iona.com] 
>> Sent: Sunday, November 25, 2007 9:27 PM
>> To: cxf-user@incubator.apache.org
>> Subject: Re: Diagnosis of stupid JAXB/JAXWS errors
>>
>> Hi Benson ,
>>
>> Is this issue same as https://issues.apache.org/jira/browse/CXF-1226?
>>
>> Regards
>>
>> Jim
>>
>> Benson Margulies wrote:
>>     
>>> Consider the following pile of snails. Now, I realize, I don't need 
>>> them in CXF, but I had coded them to test something. 
>>>       
>> Except, that, I'd 
>>     
>>> neglected to code the @WebResult at all, so while I had a wrapper, 
>>> there was no way for the code to know the element to use 
>>>       
>> for the response.
>>     
>>> It didn't work, of course. It also didn't diagnose in the 
>>>       
>> log. Should 
>>     
>>> this sort of thing produce some whining?
>>>
>>>    @RequestWrapper(className =
>>>
>>>       
>> "org.apache.cxf.javascript.fortest.BasicTypeFunctionReturnStri
>> ngWrapper"
>>     
>>> )
>>>     @ResponseWrapper(className =
>>> "org.apache.cxf.javascript.fortest.StringWrapper")
>>>     @WebResult(name = "returnValue", targetNamespace =
>>> "uri:org.apache.cxf.javascript.testns")
>>>
>>>   
>>>       
>
>   

RE: Diagnosis of stupid JAXB/JAXWS errors

Posted by Benson Margulies <bi...@basistech.com>.
I can't tell you until tomorrow. Comcast can't route to
issues.apache.org tonight, and I just disconnected from the complex
alternative path I was using just now. 

> -----Original Message-----
> From: Jim Ma [mailto:ema@iona.com] 
> Sent: Sunday, November 25, 2007 9:27 PM
> To: cxf-user@incubator.apache.org
> Subject: Re: Diagnosis of stupid JAXB/JAXWS errors
> 
> Hi Benson ,
> 
> Is this issue same as https://issues.apache.org/jira/browse/CXF-1226?
> 
> Regards
> 
> Jim
> 
> Benson Margulies wrote:
> > Consider the following pile of snails. Now, I realize, I don't need 
> > them in CXF, but I had coded them to test something. 
> Except, that, I'd 
> > neglected to code the @WebResult at all, so while I had a wrapper, 
> > there was no way for the code to know the element to use 
> for the response.
> >
> > It didn't work, of course. It also didn't diagnose in the 
> log. Should 
> > this sort of thing produce some whining?
> >
> >    @RequestWrapper(className =
> > 
> "org.apache.cxf.javascript.fortest.BasicTypeFunctionReturnStri
> ngWrapper"
> > )
> >     @ResponseWrapper(className =
> > "org.apache.cxf.javascript.fortest.StringWrapper")
> >     @WebResult(name = "returnValue", targetNamespace =
> > "uri:org.apache.cxf.javascript.testns")
> >
> >   
> 

RE: Diagnosis of stupid JAXB/JAXWS errors

Posted by Benson Margulies <bi...@basistech.com>.
No, I'd say that they are different. This person is getting a web
message sent out with a missing namespace. In my case, the response that
goes out is completely empty. 

> -----Original Message-----
> From: Jim Ma [mailto:ema@iona.com] 
> Sent: Sunday, November 25, 2007 9:27 PM
> To: cxf-user@incubator.apache.org
> Subject: Re: Diagnosis of stupid JAXB/JAXWS errors
> 
> Hi Benson ,
> 
> Is this issue same as https://issues.apache.org/jira/browse/CXF-1226?
> 
> Regards
> 
> Jim
> 
> Benson Margulies wrote:
> > Consider the following pile of snails. Now, I realize, I don't need 
> > them in CXF, but I had coded them to test something. 
> Except, that, I'd 
> > neglected to code the @WebResult at all, so while I had a wrapper, 
> > there was no way for the code to know the element to use 
> for the response.
> >
> > It didn't work, of course. It also didn't diagnose in the 
> log. Should 
> > this sort of thing produce some whining?
> >
> >    @RequestWrapper(className =
> > 
> "org.apache.cxf.javascript.fortest.BasicTypeFunctionReturnStri
> ngWrapper"
> > )
> >     @ResponseWrapper(className =
> > "org.apache.cxf.javascript.fortest.StringWrapper")
> >     @WebResult(name = "returnValue", targetNamespace =
> > "uri:org.apache.cxf.javascript.testns")
> >
> >   
> 

Re: Diagnosis of stupid JAXB/JAXWS errors

Posted by Jim Ma <em...@iona.com>.
Hi Benson ,

Is this issue same as https://issues.apache.org/jira/browse/CXF-1226?

Regards

Jim

Benson Margulies wrote:
> Consider the following pile of snails. Now, I realize, I don't need them
> in CXF, but I had coded them to test something. Except, that, I'd
> neglected to code the @WebResult at all, so while I had a wrapper, there
> was no way for the code to know the element to use for the response.
>
> It didn't work, of course. It also didn't diagnose in the log. Should
> this sort of thing produce some whining?
>
>    @RequestWrapper(className =
> "org.apache.cxf.javascript.fortest.BasicTypeFunctionReturnStringWrapper"
> )
>     @ResponseWrapper(className =
> "org.apache.cxf.javascript.fortest.StringWrapper")
>     @WebResult(name = "returnValue", targetNamespace =
> "uri:org.apache.cxf.javascript.testns")
>
>