[ https://issues.apache.org/jira/browse/CXF-1226?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Daniel Kulp resolved CXF-1226. ------------------------------ Resolution: Fixed > 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: Daniel Kulp > Fix For: 2.0.4 > > > 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.