cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Daniel Kulp (JIRA)" <j...@apache.org>
Subject [jira] Commented: (CXF-1226) elementFormDefault from package-info.java ignored with JAXWS+JAXB when there are no beans
Date Fri, 30 Nov 2007 18:32:43 GMT

    [ https://issues.apache.org/jira/browse/CXF-1226?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12547238
] 

Daniel Kulp commented on CXF-1226:
----------------------------------


This is definitely a JAX-WS spec/TCK issue.   The TCK basically requires us to make the schemas
for the wrapper type unqualified.   We originaly had them qualified (to match xfire), but
could not get the tck to pass.   

That said, with 2.0.3, there is a way to configure things in Spring config to make the schemas
qualified.  It's not very well tested though.   The ReflectionServiceFactoryBean has a qualifiedSchemas
attribute that can be set to true to have it generate the schemas as qualified.   Should look
something like:


  <jaxws:server address="/jaxwsAndJaxb" 
    serviceClass="org.apache.cxf.authservice.AuthService"> 
    <jaxws:serviceBean> 
      <bean class="org.apache.cxf.authservice.AuthServiceImpl" /> 
    </jaxws:serviceBean> 
    <jaxws:serviceFactory> 
            <bean class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"> 
            <property name="qualifyWrapperSchema" value="true"/> 
            </bean> 
    </jaxws:serviceFactory> 
   </jaxws:server> 

> elementFormDefault from package-info.java ignored with JAXWS+JAXB when there are no beans
> -----------------------------------------------------------------------------------------
>
>                 Key: CXF-1226
>                 URL: https://issues.apache.org/jira/browse/CXF-1226
>             Project: CXF
>          Issue Type: Bug
>    Affects Versions: 2.0.2, 2.0.3
>         Environment: Windows XP; Tomcat 5.5
>            Reporter: Nianhua Li
>            Assignee: Benson Margulies
>             Fix For: 2.0.3
>
>
> 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