Uploaded image for project: 'CXF'
  1. CXF
  2. CXF-1226

elementFormDefault from package-info.java ignored with JAXWS+JAXB when there are no beans

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.0.2, 2.0.3
    • 2.0.4
    • None
    • None
    • Windows XP; Tomcat 5.5

    • Unknown

    Description

      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.

      Attachments

        Activity

          People

            dkulp Daniel Kulp
            niali Nianhua Li
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: