camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Willem Jiang <willem.ji...@gmail.com>
Subject Re: Camel CXF component does not understand the SOAP message containing a tag for the wsdl:operation !!!
Date Thu, 09 Oct 2008 09:54:25 GMT
Hi

I don't know if this is a bug of CXF ,  don't do much investigation here.
But you can set the wrap style by setting a JaxWsServiceFactoryBean to 
the ClientProxyFactoryBean like this

ClientProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 

JaxWsServiceFactoryBean sf = new JaxWsServiceFactoryBean();
sf.setWrapped(false);
factory.setServiceFactory(sf);
......
BTW The sf 's wrappedStyle default value is True.

You can find a document which talks about Wrapped vs. Unwrapped Mode here[1]

[1] http://cwiki.apache.org/CXF20DOC/http-binding.html

Willem

cmoulliard wrote:
> Willem,
>
> Here is the CXF code that I use :
>
> package com.xpectis.service.tracker;
>
> import java.util.GregorianCalendar;
>
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory;
> import org.apache.cxf.frontend.ClientProxyFactoryBean;
> import org.apache.cxf.interceptor.LoggingInInterceptor;
> import org.apache.cxf.interceptor.LoggingOutInterceptor;
> import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
> import org.junit.Test;
>
> import javax.xml.datatype.DatatypeFactory;
> import javax.xml.datatype.XMLGregorianCalendar;
>
> import junit.framework.Assert;
>
> public class TrackerServiceTest {
> 	
> 	private static String ADDRESS = "http://localhost:9000/tracker";
> 	
> 	//TrackerService trackerService;
> 	
> 	   /** The Constant LOG. */
>     private static final Log LOG =
> LogFactory.getLog(TrackerServiceTest.class);
>
>      /**
>      * Test call PostParcel Web Service.
>      * 
>      * @throws Exception the exception
>      */
> 	@Test
>     public void testPostParcel() throws Exception
>     {
> 		
> 		// Create Client Proxy
> 		ClientProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
> 		factory.setServiceClass(TrackParcelEndpoint.class);
> 		factory.setAddress(ADDRESS);
> 		factory.getInInterceptors().add(new LoggingInInterceptor());
> 		factory.getOutInterceptors().add(new LoggingOutInterceptor());
>
> 		TrackParcelEndpoint client = (TrackParcelEndpoint) factory.create();
> 		
> 		// Create InputTrackParcel client
> 		InputTrackParcel parcel = new InputTrackParcel();
> 		parcel.setName("chm");
> 		parcel.setDestination("Brussels");
> 		parcel.setOrigin("Florennes");
> 		//parcel.setDeliveryDate(calendar);
> 		
>                 // Call web service
> 		OutputTrackParcel result = client.PostParcel(parcel);
> 		LOG.info("Result : " + result.getReference());
> 		Assert.assertNotNull(result);
> 		
> 		
>     }
>     
> }
>
>
> Kind regards,
>
> Charles
>
>
> willem.jiang wrote:
>   
>> Hi,
>>
>> The server side behavior is right (WSDL, SEI) , it can't receive the 
>> wrapped message.
>> Can you show me the client side code which call for the service ?
>> I don't know why your client send a wrapped soap message, maybe you use 
>> a wrong front end.
>>
>> Willem
>>
>> cmoulliard wrote:
>>     
>>> Here is the route configuration in camel :
>>>
>>> <?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:context="http://www.springframework.org/schema/context"
>>> 	xmlns:cxf="http://activemq.apache.org/camel/schema/cxfEndpoint"
>>> 	
>>> 	xsi:schemaLocation="
>>>        http://www.springframework.org/schema/beans
>>>        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
>>>        http://activemq.apache.org/camel/schema/cxfEndpoint
>>>        http://activemq.apache.org/camel/schema/cxf/cxfEndpoint.xsd
>>>        http://activemq.apache.org/camel/schema/spring
>>>        http://activemq.apache.org/camel/schema/spring/camel-spring.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-extension-http-jetty.xml" />
>>>        <import resource="classpath:tracker-core-services.xml" />
>>>
>>>    <cxf:cxfEndpoint id="serviceTracker"
>>>             address="http://localhost:9000/tracker" 
>>>     		serviceClass="com.xpectis.service.tracker.impl.TrackerServiceImpl"
>>>     />
>>>     		
>>>    <camelContext id="camel" trace="true"
>>> xmlns="http://activemq.apache.org/camel/schema/spring">
>>>     <route>
>>>       <from uri="cxf:bean:serviceTracker" />
>>>       <to uri="bean:tracker" /> 
>>>     </route>
>>>    </camelContext> 
>>>    
>>>    <bean id="tracker" class="com.xpectis.tracker.bean.ExtractParcel">
>>>    		<property name="saveService" ref="saveService" />
>>>    </bean>
>>>
>>> </beans>
>>>
>>> The WSDL file :
>>>
>>> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
>>> <wsdl:definitions
>>>   targetNamespace="http://tracker.service.xpectis.com"
>>>   xmlns="http://schemas.xmlsoap.org/wsdl/" 
>>>   xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
>>>   xmlns:tns="http://tracker.service.xpectis.com"
>>>   xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
>>>   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
>>>   
>>>   <!-- Type definitions for input- and output parameters for webservice
>>> -->
>>>   <wsdl:types>
>>>     <xsd:schema targetNamespace="http://tracker.service.xpectis.com">
>>>       <xsd:element name="inputTrackParcel">
>>>         <xsd:complexType>
>>>           <xsd:sequence>
>>>           	<xsd:element name="name" type="xsd:string" maxOccurs="1"
>>> minOccurs="1"/>
>>>           	<xsd:element name="destination" type="xsd:string"
>>> maxOccurs="1"
>>> minOccurs="1"></xsd:element>
>>>           	<xsd:element name="origin" type="xsd:string"></xsd:element>
>>>           	<xsd:element name="deliveryDate" type="xsd:date" maxOccurs="1"
>>> minOccurs="0"></xsd:element>
>>>           </xsd:sequence>
>>>         </xsd:complexType>
>>>       </xsd:element>
>>>       <xsd:element name="outputTrackParcel">
>>>         <xsd:complexType>
>>>           <xsd:sequence>
>>>             <xsd:element name="reference" type="xsd:int"/>
>>>           </xsd:sequence>
>>>         </xsd:complexType>
>>>       </xsd:element>
>>>     </xsd:schema>
>>>   </wsdl:types>
>>>   
>>>   <!-- Message definitions for input and output -->  
>>>   <wsdl:message name="inputTrackParcel">
>>>     <wsdl:part element="tns:inputTrackParcel" name="parameters"/>
>>>   </wsdl:message>
>>>   <wsdl:message name="outputTrackParcel">
>>>     <wsdl:part element="tns:outputTrackParcel" name="parameters"/>
>>>   </wsdl:message>
>>>   
>>>   <!-- Port (interface) definitions -->
>>>   <wsdl:portType name="TrackParcelEndpoint">
>>>     <wsdl:operation name="PostParcel">
>>>       <wsdl:input message="tns:inputTrackParcel"/>
>>>       <wsdl:output message="tns:outputTrackParcel"/>
>>>     </wsdl:operation>
>>>   </wsdl:portType>
>>>   
>>>   <!-- Port bindings to transports and encoding - HTTP, document literal
>>> encoding is used -->  
>>>   <wsdl:binding name="TrackParcelBinding" type="tns:TrackParcelEndpoint">
>>>     <soap:binding style="document"
>>> transport="http://schemas.xmlsoap.org/soap/http"/>
>>>     <wsdl:operation name="PostParcel">
>>>       <soap:operation
>>> soapAction="http://tracker.service.xpectis.com/PostParcel"/>
>>>       <wsdl:input>
>>>         <soap:body parts="parameters" use="literal"/>
>>>       </wsdl:input>
>>>       <wsdl:output>
>>>         <soap:body parts="parameters" use="literal"/>
>>>       </wsdl:output>
>>>     </wsdl:operation>
>>>   </wsdl:binding>
>>>   
>>>   <!-- Service definition -->
>>>   <wsdl:service name="TrackParcelService">
>>>     <wsdl:port binding="tns:TrackParcelBinding" name="TrackParcelPort">
>>>       <soap:address location="http://tracker.service.xpectis.com"/>
>>>     </wsdl:port>
>>>   </wsdl:service>
>>> </wsdl:definitions>
>>>
>>>
>>> The interface :
>>>
>>> package com.xpectis.service.tracker;
>>>
>>> import javax.jws.WebMethod;
>>> import javax.jws.WebParam;
>>> import javax.jws.WebResult;
>>> import javax.jws.WebService;
>>> import javax.jws.soap.SOAPBinding;
>>> import javax.xml.bind.annotation.XmlSeeAlso;
>>> import com.xpectis.service.tracker.InputTrackParcel;
>>> import com.xpectis.service.tracker.OutputTrackParcel;
>>> import com.xpectis.service.tracker.ObjectFactory;
>>>
>>> /**
>>>  * This class was generated by Apache CXF 2.1.2
>>>  * Wed Oct 08 11:05:48 CEST 2008
>>>  * Generated source version: 2.1.2
>>>  * 
>>>  */
>>>  
>>> @WebService(targetNamespace = "http://tracker.service.xpectis.com", name
>>> =
>>> "TrackParcelEndpoint")
>>> @XmlSeeAlso({ObjectFactory.class})
>>> @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
>>> public interface TrackParcelEndpoint {
>>>
>>>     @WebResult(name = "outputTrackParcel", targetNamespace =
>>> "http://tracker.service.xpectis.com", partName = "parameters")
>>>     @WebMethod(operationName = "PostParcel", action =
>>> "http://tracker.service.xpectis.com/PostParcel")
>>>     public OutputTrackParcel PostParcel(@WebParam(partName =
>>> "parameters",
>>> name = "inputTrackParcel", targetNamespace =
>>> "http://tracker.service.xpectis.com") InputTrackParcel parameters
>>>     );
>>> }
>>>
>>> And implementation
>>>
>>> package com.xpectis.service.tracker.impl;
>>>
>>> import org.apache.commons.logging.Log;
>>> import org.apache.commons.logging.LogFactory;
>>>
>>> import com.xpectis.service.tracker.InputTrackParcel;
>>> import com.xpectis.service.tracker.OutputTrackParcel;
>>> import com.xpectis.service.tracker.TrackParcelEndpoint;
>>>
>>> import org.apache.cxf.interceptor.*;
>>>
>>>
>>> /**
>>>  * The webservice we have implemented.
>>>  */
>>> @InInterceptors(interceptors =
>>> "org.apache.cxf.interceptor.LoggingInInterceptor")
>>> @OutInterceptors(interceptors =
>>> "org.apache.cxf.interceptor.LoggingOutInterceptor")
>>> public class TrackerServiceImpl implements TrackParcelEndpoint {
>>> 	
>>>     private static final Log LOG =
>>> LogFactory.getLog(TrackerServiceImpl.class);
>>> 	private static int result = 0;
>>> 	
>>> 	public OutputTrackParcel PostParcel(InputTrackParcel parameters) {
>>> 		
>>> 		OutputTrackParcel response = new OutputTrackParcel();
>>> 		response.setReference(result++);
>>> 		LOG.info("Result : " + result);
>>> 		return response;
>>> 				
>>> 	}
>>> }
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> willem.jiang wrote:
>>>   
>>>       
>>>> Can you show me the SEI file  and route configuration ?
>>>> It looks like a wrapped and unwrapped issue.
>>>>
>>>> Willem
>>>> cmoulliard wrote:
>>>>     
>>>>         
>>>>> Hi,
>>>>>
>>>>> I have discovered a small problem between a client created using the
>>>>> Client
>>>>> ProxyFactoryBean and my webservice running with Apache Camel - CXF
>>>>> component.
>>>>>
>>>>> When the client calls the web service, the ClientProxyFactoryBean class
>>>>> of
>>>>> CXF generates the following SOAP message :
>>>>>
>>>>> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
>>>>> <soap:Body>
>>>>> <ns1:PostParcel xmlns:ns1="http://tracker.service.xpectis.com/">
>>>>> <ns2:inputTrackParcel xmlns:ns2="http://tracker.service.xpectis.com">
>>>>> <name>chm</name>
>>>>> <destination>Brussels</destination>
>>>>> <origin>Florennes</origin>
>>>>> </ns2:inputTrackParcel>
>>>>> </ns1:PostParcel>
>>>>> </soap:Body>
>>>>> </soap:Envelope>
>>>>>
>>>>> Unfortunately, the tag <ns1:PostParcel> is not supported by the
web
>>>>> service
>>>>> called in camel. If I remove it and send the message using SOAPUI
>>>>> client,
>>>>> everything works fine.
>>>>>
>>>>> How can I solve this problem in Camel CXF component ?
>>>>>
>>>>> Charles Moulliard
>>>>>
>>>>> -----
>>>>> Enterprise Architect
>>>>>
>>>>> Xpectis
>>>>> 12, route d'Esch
>>>>> L-1470 Luxembourg
>>>>>
>>>>> Phone +352 25 10 70 470
>>>>> Mobile +352 621 45 36 22
>>>>>
>>>>> e-mail : cmoulliard@xpectis.com
>>>>> web site :  www.xpectis.com www.xpectis.com 
>>>>> My Blog :  http://cmoulliard.blogspot.com/
>>>>> http://cmoulliard.blogspot.com/  
>>>>>   
>>>>>       
>>>>>           
>>>>     
>>>>         
>>> -----
>>> Enterprise Architect
>>>
>>> Xpectis
>>> 12, route d'Esch
>>> L-1470 Luxembourg
>>>
>>> Phone +352 25 10 70 470
>>> Mobile +352 621 45 36 22
>>>
>>> e-mail : cmoulliard@xpectis.com
>>> web site :  www.xpectis.com www.xpectis.com 
>>> My Blog :  http://cmoulliard.blogspot.com/
>>> http://cmoulliard.blogspot.com/  
>>>   
>>>       
>>
>>     
>
>
> -----
> Enterprise Architect
>
> Xpectis
> 12, route d'Esch
> L-1470 Luxembourg
>
> Phone +352 25 10 70 470
> Mobile +352 621 45 36 22
>
> e-mail : cmoulliard@xpectis.com
> web site :  www.xpectis.com www.xpectis.com 
> My Blog :  http://cmoulliard.blogspot.com/ http://cmoulliard.blogspot.com/  
>   


Mime
View raw message