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-2228) WSDL2XML generated binding not passing correct method arguments in service implementation
Date Thu, 21 May 2009 18:27:45 GMT

    [ https://issues.apache.org/jira/browse/CXF-2228?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12711743#action_12711743
] 

Daniel Kulp commented on CXF-2228:
----------------------------------


It's due to a mismatch in the writing and reading algorithms in the XML binding.

The writing side ignores the rootNode attibute if there is a single part in the message. 
 The reading side, however, consumes the first element if rootNode attribute is set.   Thus,
JAXB does't get the right data.     I've updated the reading side to match what the writing
side does.   

> WSDL2XML generated binding not passing correct method arguments in service implementation
> -----------------------------------------------------------------------------------------
>
>                 Key: CXF-2228
>                 URL: https://issues.apache.org/jira/browse/CXF-2228
>             Project: CXF
>          Issue Type: Bug
>    Affects Versions: 2.1.3, 2.1.5
>         Environment: Test Service is deployed in Tomcat (6.0.14) Using Java build (1.6.0_06-b020)

>            Reporter: Vinod D
>
> http://www.nabble.com/wsdl2xml-and-XML-Binding-td23608106.html
> Hello 
> I am running into an isse with XML Binding. Here is what I am doing 
> - Using CXF 2.1.3 and deploying it in tomcat 6.x 
> - Define a simple wsdl (wsdl first approach) with one method (sayHi) which takes two
string params and returns a cat-ed string. 
> - Works fine using SOAP Binding (first two log entried below). 
> - Used wsdl2xml tool to create a XML Port and XML Binding and invoke the sayHi method.

> - I see in XML message logging on tomcat call (sayHi) coming with two string param ,
however to the service method impl I see both the strings 
> are passed as null (last two log-entry below). 
> Are there any issues re. using wsdl2xml in this manner or something I am missing. 
> regards 
> -Vinod 
> ---------------------------------- 
> INFO: Inbound Message 
> ---------------------------- 
> Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><

> soap:Body><ns2:sayHi xmlns:ns2="http://acme.com/test/"><arg1>argument1</arg1><ar

> g2>argument2</arg2></ns2:sayHi></soap:Body></soap:Envelope>

> -------------------------------------- 
> TestPortTypeImpl::sayHi() is called arg1=argument1, arg2=argument2 
> May 18, 2009 4:42:25 PM org.apache.cxf.interceptor.LoggingOutInterceptor$Logging 
> Callback onClose 
> INFO: Outbound Message 
> --------------------------- 
> Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><

> soap:Body><ns2:sayHiResponse xmlns:ns2="http://acme.com/test/"><out>sayHi
to : a 
> rgument1 and argument2</out></ns2:sayHiResponse></soap:Body></soap:Envelope>

> -------------------------------------- 
> INFO: Inbound Message 
> ---------------------------- 
> Payload: <ns2:sayHi xmlns:ns2="http://acme.com/test/"><arg1>argument1</arg1><arg

> 2>argument2</arg2></ns2:sayHi> 
> -------------------------------------- 
> TestPortTypeXMLImpl::sayHi() is called arg1=null, arg2=null 
> May 18, 2009 4:47:55 PM org.apache.cxf.interceptor.LoggingOutInterceptor$Logging 
> Callback onClose 
> INFO: Outbound Message 
> --------------------------- 
> Encoding: UTF-8 
> Headers: {} 
> Messages: 
> Payload: <ns2:sayHiResponse xmlns:ns2="http://acme.com/test/"><out>sayHi
to : nu 
> ll and null</out></ns2:sayHiResponse> 
> -------------------------------------- 
> Some more obervation: 
> If I comment out the <xformat:body ...rootNode="sayHi"> element from the XML binding
generated by wsdl2xml as shown below, I see the parameters passed correctly to the service
implementation and works as expected. 
> <wsdl:bindingname="testXMLBinding"type="tns:testPortType"><xformat:binding/><wsdl:operationname="sayHi"><wsdl:input><!--
xformat:body xmlns="http://acme.com/test/" rootNode="sayHi" / --></wsdl:input><wsdl:output><!--
xformat:body xmlns="http://acme.com/test/" rootNode="sayHi" / --></wsdl:output></wsdl:operation></wsdl:binding>

> Not sure what is right approach here .. 
> -Vinod  
> Re: wsdl2xml and XML Binding  by dkulp May 19, 2009; 01:24pm :: Rate this Message:  
 - Use ratings to moderate (?)
> Reply | Reply to Author | Print | View Threaded | Show Only this Message 
> That SHOULD be fine.   Can you : 
> 1) try with CXF 2.1.5 or 2.2.1.   This MAY be fixed already. 
> 2) If not, can you package up your sample and attach it to a JIRA bug report? 
> Thanks! 
> Dan 
>  
> - I tried using 2.1.5 and still observed the same issue. Test  Wsdl which has xml binding
generated from WSDL2XML and client/server are pasted below.
> WSDL 
> _____
> <?xml version="1.0" encoding="UTF-8"?>
> <wsdl:definitions name="test" targetNamespace="http://acme.com/test/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://acme.com/test/" xmlns:xformat="http://cxf.apache.org/bindings/xformat"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
>   <wsdl:types>
> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://acme.com/test/">
>             <xsd:element name="sayHi">
>             	<xsd:complexType>
>             		<xsd:sequence>
>             			<xsd:element name="arg1" type="xsd:string"/>
>             			<xsd:element name="arg2" type="xsd:string">
>             			</xsd:element>
>             		</xsd:sequence>
>             	</xsd:complexType>
>             </xsd:element>
>             <xsd:element name="sayHiResponse">
>             	<xsd:complexType>
>             		<xsd:sequence>
>             			<xsd:element name="out" type="xsd:string"/>
>             		</xsd:sequence>
>             	</xsd:complexType>
>             </xsd:element>
>         </xsd:schema>
>   </wsdl:types>
>   <wsdl:message name="sayHiRequest">
>     <wsdl:part name="in" element="tns:sayHi">
>     </wsdl:part>
>   </wsdl:message>
>   <wsdl:message name="sayHiResponse">
>     <wsdl:part name="out" element="tns:sayHiResponse">
>     </wsdl:part>
>   </wsdl:message>
>   <wsdl:portType name="testPortType">
>     <wsdl:operation name="sayHi">
>       <wsdl:input message="tns:sayHiRequest">
>     </wsdl:input>
>       <wsdl:output message="tns:sayHiResponse">
>     </wsdl:output>
>     </wsdl:operation>
>   </wsdl:portType>
>   <wsdl:binding name="testSOAP" type="tns:testPortType">
>     <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
>     <wsdl:operation name="sayHi">
>       <soap:operation soapAction="http://acme.com/test/sayHi"/>
>       <wsdl:input>
>         <soap:body use="literal"/>
>       </wsdl:input>
>       <wsdl:output>
>         <soap:body use="literal"/>
>       </wsdl:output>
>     </wsdl:operation>
>   </wsdl:binding>
>   <wsdl:binding name="testXMLBinding" type="tns:testPortType">
>     <xformat:binding />
>     <wsdl:operation name="sayHi">
>       <wsdl:input>
>       <xformat:body xmlns="http://acme.com/test/" rootNode="sayHi" />
>       </wsdl:input>
>       <wsdl:output>
>       <xformat:body xmlns="http://acme.com/test/" rootNode="sayHi" />
>       </wsdl:output>
>     </wsdl:operation>
>   </wsdl:binding>
>   <wsdl:service name="test">
>     <wsdl:port name="testXMLPort" binding="tns:testXMLBinding">
>       <http:address location="http://localhost:8080/test/services/testxml" />
>     </wsdl:port>
>     <wsdl:port name="testSOAP" binding="tns:testSOAP">
>       <soap:address location="http://localhost:8080/test/services/test"/>
>     </wsdl:port>
>   </wsdl:service>
> </wsdl:definitions>
> Service 
> ______
> TestPortTypeImpl.java and TestPortTypeXMLImpl.java are below
> package com.acme.server;
> import javax.jws.WebService;
> import com.acme.test.TestPortType;
> /**
>  *
>  */
> @WebService(targetNamespace = "http://acme.com/test/",
> 	    portName="testXMLPort",
> 	    serviceName="test",
> 	    endpointInterface="com.acme.test.TestPortType")
> public class TestPortTypeXMLImpl implements TestPortType {
> 	/*
> 	 * (non-Javadoc)
> 	 * 
> 	 * @see com.acme.test.TestPortType#sayHi(java.lang.String, java.lang.String)
> 	 */
> 	public String sayHi(String arg1, String arg2) {
> 		System.out.println("TestPortTypeXMLImpl::sayHi() is called arg1="
> 				+ arg1 + ", arg2=" + arg2);
> 		return "sayHi to : " + arg1 + " and " + arg2;
> 	}
> }
> package com.acme.server;
> import javax.jws.WebService;
> import javax.xml.bind.annotation.XmlSeeAlso;
> import com.acme.test.ObjectFactory;
> import com.acme.test.TestPortType;
> /**
>  * Some test program
>  */
> @WebService(targetNamespace = "http://acme.com/test/",
> 		    portName="testSOAP",
> 		    serviceName="test",
> 		    endpointInterface="com.acme.test.TestPortType")
> @XmlSeeAlso({ObjectFactory.class})
> public class TestPortTypeImpl implements TestPortType {
> 	/* (non-Javadoc)
> 	 * @see com.acme.test.TestPortType#sayHi(java.lang.String, java.lang.String)
> 	 */
> 	public String sayHi(String arg1, String arg2) {
> 		System.out.println("TestPortTypeImpl::sayHi() is called arg1=" + arg1 + 
> 				           ", arg2=" + arg2 );
> 		return "sayHi to : " + arg1 + " and "  + arg2;
> 	}
> }
> Client Test Program
> ________________
> package com.acme.client;
> import java.net.MalformedURLException;
> import java.net.URL;
> import javax.xml.namespace.QName;
> import com.acme.test.Test;
> import com.acme.test.TestPortType;
> /**
>  *
>  */
> public class TestClient {
>     public final static URL WSDL_LOCATION;
>     public final static QName SERVICE = new QName("http://acme.com/test/", "test");
>     public final static QName TestSoapPort = new QName("http://acme.com/test/", "TestSOAP");
>     public final static QName TestXMLPort = new QName("http://acme.com/test/", "TestXMLPort");
> 	
> 	Test m_testService = null;	
> 	TestPortType m_portType = null;
>     
>     static {
>         URL url = null;
>         try {
>             url = new URL("http://localhost:8080/acws/services/test?wsdl");
>         } catch (MalformedURLException e) {
>             System.err.println("Can not initialize the default wsdl from file:/C:/acme/nbi/cpsm/build/../nbi/wsdl/acws.wsdl");
>             // e.printStackTrace();
>         }
>         WSDL_LOCATION = url;
>     }
> 	
> 	/**
> 	 * @param args
> 	 */
> 	public static void main(String[] args) {
> 		TestClient client = new TestClient();
> 		client.initializeService(args);
> 		client.testHi(args);
> 	}
> 	
> 	private void testHi(String[] args) {
> 		try {
> 		   String result = m_portType.sayHi("argument1", "argument2");
> 		   System.out.println("Called sayHi() and got =" + result);
> 		}catch (Exception e) {
> 			e.printStackTrace();
> 		}
> 	}
> 	private void initializeService(String [] args) {
> 		
> 		try {
> 			m_testService = new Test(WSDL_LOCATION, SERVICE);
> 			m_portType = m_testService.getTestXMLPort();
> 		} catch (Exception e) {
> 			e.printStackTrace();
> 		}
> 	}
> }
> Please refer to the thread on this -> http://www.nabble.com/wsdl2xml-and-XML-Binding-td23608106.html

-- 
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