cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Nianhua Li (JIRA)" <j...@apache.org>
Subject [jira] Created: (CXF-1226) Missing input/output param namespace in SOAP
Date Wed, 21 Nov 2007 04:27:42 GMT
Missing input/output param namespace in SOAP
--------------------------------------------

                 Key: CXF-1226
                 URL: https://issues.apache.org/jira/browse/CXF-1226
             Project: CXF
          Issue Type: Bug
    Affects Versions: 2.0.3, 2.0.2
         Environment: Windows XP; Tomcat 5.5
            Reporter: Nianhua Li


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.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message