Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

The cxf: component provides integration with Apache CXF for connecting to JAX-WS services hosted in CXF.

Table of Contents

Maven users will need to add the following dependency to their pom.xml for this component:

Code Block
languagexml

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-cxf</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
Tip
titleCXF dependencies

If you want to learn about CXF dependencies you can checkout the WHICH-JARS text file.

URI format

Code Block
languagejava

cxf:bean:cxfEndpoint[?options]

Where cxfEndpoint represents a bean ID that references a bean in the Spring bean registry. With this URI format, most of the endpoint details are specified in the bean definition.

Code Block
languagejava

cxf://someAddress[?options]

...

For either style above, you can append options to the URI as follows:

Code Block
languagejava

cxf:bean:cxfEndpoint?wsdlURL=wsdl/hello_world.wsdl&dataFormat=PAYLOAD

Options

Wiki Markup
{div:class=confluenceTableSmall}
|| Name || Required || Description ||
| {{wsdlURL}} | No | The location of the WSDL. It is obtained from endpoint address by default. \\ \\ _Example_: [file://local/wsdl/hello.wsdl] or {{wsdl/hello.wsdl}} |
| {{serviceClass}} | Yes | The name of the SEI (Service Endpoint Interface) class. This class can have, but does not require, JSR181 annotations. \\ This option is only required by POJO mode. If the wsdlURL option is provided, serviceClass is not required for PAYLOAD and MESSAGE mode. When wsdlURL option is used without serviceClass, the serviceName and portName (endpointName for Spring configuration) options *MUST* be provided. It is possible to use {{\#}} notation to reference a {{serviceClass}} object instance from the registry. E.g. {{serviceClass=#beanName}}. The {{serviceClass}} for a CXF producer (that is, the {{to}} endpoint) should be a Java interface.\\ *Since 2.8,* it is possible to omit both wsdlURL and serviceClass options for PAYLOAD and MESSAGE mode. When they are omitted, arbitrary XML elements can be put in CxfPayload's body in PAYLOAD mode to facilitate CXF Dispatch Mode. \\ \\ Please be advised that the *referenced object cannot be a Proxy* (Spring AOP Proxy is OK) as it relies on {{Object.getClass().getName()}} method for non Spring AOP Proxy. \\ \\ _Example_: {{org.apache.camel.Hello}} |
| {{serviceName}} | No | The service name this service is implementing, it maps to the {{wsdl:service@name}}. \\ \\ *Required* for camel-cxf consumer since camel-2.2.0 or if more than one {{serviceName}} is present in WSDL. \\ \\ _Example_: \{http:­//org.apache.camel}ServiceName |
| {{portName}} | No | The port name this service is implementing, it maps to the {{wsdl:port@name}}. \\ \\ *Required* for camel-cxf consumer since camel-2.2.0 or if more than one {{portName}} is present under {{serviceName}}. \\ \\ _Example_: \{http:­//org.apache.camel}PortName |
| {{dataFormat}} | No | The data type messages supported by the CXF endpoint. \\ \\ _Default_: {{POJO}} \\ _Example_: {{POJO}}, {{PAYLOAD}}, {{MESSAGE}} |
| {{relayHeaders}} | No | Please see the *Description of* {{{*}relayHeaders{*}}} *option* section for this option.  Should a CXF endpoint relay headers along the route. Currently only available when {{dataFormat=POJO}} \\ \\ _Default_: {{true}} \\ _Example_: {{true}}, {{false}} |
| {{wrapped}} | No | Which kind of operation that CXF  endpoint producer will invoke \\ \\ _Default_: {{false}} \\ _Example_: {{true}}, {{false}} |
| {{wrappedStyle}} | No | *New in 2.5.0* The WSDL style that describes how parameters are represented in the SOAP body. If the value is false, CXF will chose the document-literal unwrapped style, If the value is true, CXF will chose the document-literal wrapped style \\ \\ _Default_: {{Null}} \\ _Example_: {{true}}, {{false}} |
| {{setDefaultBus}} | No | Will set the default bus when CXF endpoint create a bus by itself \\ \\ _Default_: {{false}} \\ _Example_: {{true}}, {{false}} |
| {{bus}} | No | A default bus created by CXF Bus Factory. Use {{\#}} notation to reference a bus object from the registry. The referenced object must be an instance of {{org.apache.cxf.Bus}}. \\ \\ _Example_: {{bus=#busName}} |
| {{cxfBinding}} | No | Use {{\#}} notation to reference a CXF binding object from the registry. The referenced object must be an instance of {{org.apache.camel.component.cxf.CxfBinding}} (use an instance of {{org.apache.camel.component.cxf.DefaultCxfBinding}}). \\ \\ _Example_: {{cxfBinding=#bindingName}} \\ |
| {{headerFilterStrategy}} | No | Use {{\#}} notation to reference a header filter strategy object from the registry. The referenced object must be an instance of {{org.apache.camel.spi.HeaderFilterStrategy}} (use an instance of {{org.apache.camel.component.cxf.CxfHeaderFilterStrategy}}). \\ \\ _Example_: {{headerFilterStrategy=#strategyName}} |
| {{loggingFeatureEnabled}} | No | New in 2.3. This option enables CXF Logging Feature which writes inbound and outbound SOAP messages to log. \\ \\ _Default_: {{false}} \\ _Example_: {{loggingFeatureEnabled{}}}{{=true}} |
| {{defaultOperationName}} | No | New in 2.4, this option will set the default operationName that will be used by the CxfProducer which invokes the remote service. \\ \\ _Default_: {{null}} \\ _Example_: {{defaultOperationName{}}}{{=greetMe}} |
| {{defaultOperationNamespace}} | No | New in 2.4. This option will set the default operationNamespace that will be used by the CxfProducer which invokes the remote service. \\ \\ _Default_: {{null}} \\ _Example_: {{defaultOperationNamespace{}}}{{=}}{{[http://apache.org/hello_world_soap_http]}} |
| {{synchronous}} | No | New in 2.5. This option will let cxf endpoint decide to use sync or async API to do the underlying work. The default value is false which means camel-cxf endpoint will try to use async API by default. \\ \\ _Default_: {{false}} \\ _Example_: synchronous=true |
| {{publishedEndpointUrl}} | No | New in 2.5. This option can override the endpointUrl that published from the WSDL which can be accessed with service address url plus ?wsdl. \\ \\ _Default_: {{null}} \\ _Example_: publshedEndpointUrl=[http://example.com/service] |
| {{properties.XXX}} | No | *Camel 2.8:* Allows to set custom properties to CXF in the endpoint uri. For example setting {{properties.mtom-enabled=true}} to enable MTOM. |
| {{allowStreaming}} | No | New in 2.8.2.   This option controls whether the CXF component, when running in PAYLOAD mode (see below), will DOM parse the incoming messages into DOM Elements or keep the payload as a javax.xml.transform.Source object that would allow streaming in some cases. | 
| {{skipFaultLogging}} | No | New in 2.11. This option controls whether the PhaseInterceptorChain skips logging the Fault that it catches. |
| {{username}} | No | New in *Camel 2.12.3* This option is used to set the basic authentication information of username for the CXF client. |
| {{password}} | No | New in *Camel 2.12.3* This option is used to set the basic authentication information of password for the CXF client. |

The {{serviceName}} and {{portName}} are [QNames|http://en.wikipedia.org/wiki/QName], so if you provide them be sure to prefix them with their \{namespace\} as shown in the examples above.

h4. The descriptions of the dataformats

{div:class=confluenceTableSmall}
|| DataFormat || Description ||
| {{POJO}} | POJOs (Plain old Java objects) are the Java parameters to the method being invoked on the target server.  Both Protocol and Logical JAX-WS handlers are supported. |
| {{PAYLOAD}} | {{PAYLOAD}} is the message payload (the contents of the {{soap:body}}) after message configuration in the CXF endpoint is applied.  Only Protocol JAX-WS handler is supported.  Logical JAX-WS handler is not supported. |
| {{MESSAGE}} | {{MESSAGE}} is the raw message that is received from the transport layer. It is not suppose to touch or change Stream, some of the CXF interceptor will be removed if you are using this kind of DataFormat so you can't see any soap headers after the camel-cxf consumer and JAX-WS handler is not supported. |
| {{CXF_MESSAGE}} | New in *Camel 2.8.2*, {{CXF_MESSAGE}} allows for invoking the full capabilities of CXF interceptors by converting the message from the transport layer into a raw SOAP message|

You can determine the data format mode of an exchange by retrieving the exchange property, {{CamelCXFDataFormat}}.  The exchange key constant is defined in {{org.apache.camel.component.cxf.CxfConstants.DATA_FORMAT_PROPERTY}}.
{div}
How to enable CXF's LoggingOutInterceptor in MESSAGE mode

...

You can plugin your own MessageHeadersRelay implementations overriding or adding additional ones to the list of relays. In order to override a preloaded relay instance just make sure that your MessageHeadersRelay implementation services the same name spaces as the one you looking to override. Also note, that the overriding relay has to service all of the name spaces as the one you looking to override, or else a runtime exception on route start up will be thrown as this would introduce an ambiguity in name spaces to relay instance mappings.

Code Block
xml
xml

<cxf:cxfEndpoint ...>
   <cxf:properties>
     <entry key="org.apache.camel.cxf.message.headers.relays">
       <list>
         <ref bean="customHeadersRelay"/>
       </list>
     </entry>
   </cxf:properties>
 </cxf:cxfEndpoint>
 <bean id="customHeadersRelay" class="org.apache.camel.component.cxf.soap.headers.CustomHeadersRelay"/>

...

  • POJO and PAYLOAD modes are supported. In POJO mode, only out-of-band message headers are available for filtering as the in-band headers have been processed and removed from header list by CXF. The in-band headers are incorporated into the MessageContentList in POJO mode. The camel-cxf component does make any attempt to remove the in-band headers from the MessageContentList. If filtering of in-band headers is required, please use PAYLOAD mode or plug in a (pretty straightforward) CXF interceptor/JAXWS Handler to the CXF endpoint.
  • The Message Header Relay mechanism has been merged into CxfHeaderFilterStrategy. The relayHeaders option, its semantics, and default value remain the same, but it is a property of CxfHeaderFilterStrategy.
    Here is an example of configuring it.

    Wiki Markup
    {snippet:id=dropAllMessageHeadersStrategy|lang=xml|url=camel/trunk/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/soap/headers/CxfMessageHeadersRelayTest-context.xml}

    Then, your endpoint can reference the CxfHeaderFilterStrategy.

    Wiki Markup
    {snippet:id=noRelayRoute|lang=xml|url=camel/trunk/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/soap/headers/CxfMessageHeadersRelayTest-context.xml}
  • The MessageHeadersRelay interface has changed slightly and has been renamed to MessageHeaderFilter. It is a property of CxfHeaderFilterStrategy. Here is an example of configuring user defined Message Header Filters:

    Wiki Markup
    {snippet:id=customMessageFilterStrategy|lang=xml|url=camel/trunk/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/soap/headers/CxfMessageHeadersRelayTest-context.xml}
  • Other than relayHeaders, there are new properties that can be configured in CxfHeaderFilterStrategy.

    Wiki Markup
    {div:class=confluenceTableSmall}
    || Name || Required || Description ||
    | {{relayHeaders}} | No | All message headers will be processed by Message Header Filters \\ \\ _Type_: {{boolean}} \\ _Default_: {{true}} |
    | {{relayAllMessageHeaders}} | No | All message headers will be propagated (without processing by Message Header Filters) \\ \\ _Type_: {{boolean}} \\ _Default_: {{false}} |
    | {{allowFilterNamespaceClash}} | No | If two filters overlap in activation namespace, the property control how it should be handled.  If the value is {{true}}, last one wins.  If the value is {{false}}, it will throw an exception \\ \\ _Type_: {{boolean}} \\ _Default_: {{false}} |
    
    h3. Configure the CXF endpoints with Spring
    
    You can configure the CXF endpoint with the Spring configuration file shown below, and you can also embed the endpoint into the {{camelContext}} tags.  When you are invoking the service endpoint, you can set the {{operationName}} and {{operationNamespace}} headers to explicitly state which operation you are calling.
    {code:xml}
    <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:cxf="http://camel.apache.org/schema/cxf"
            xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
            http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
         <cxf:cxfEndpoint id="routerEndpoint" address="http://localhost:9003/CamelContext/RouterPort"
         		serviceClass="org.apache.hello_world_soap_http.GreeterImpl"/>
         <cxf:cxfEndpoint id="serviceEndpoint" address="http://localhost:9000/SoapContext/SoapPort"
         		wsdlURL="testutils/hello_world.wsdl"
         		serviceClass="org.apache.hello_world_soap_http.Greeter"
         		endpointName="s:SoapPort"
         		serviceName="s:SOAPService"
         	xmlns:s="http://apache.org/hello_world_soap_http" />
         <camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring">
           <route>
             <from uri="cxf:bean:routerEndpoint" />
             <to uri="cxf:bean:serviceEndpoint" />
           </route>
        </camelContext>
      </beans>
    {code}
    
    Be sure to include the JAX-WS {{schemaLocation}} attribute specified on the root beans element. This allows CXF to validate the file and is required.  Also note the namespace declarations at the end of the {{<cxf:cxfEndpoint/>}} tag--these are required because the combined {{\{namespace}localName}} syntax is presently not supported for this tag's attribute values.
    
    The {{cxf:cxfEndpoint}} element supports many additional attributes:
    {div:class=confluenceTableSmall}
    || Name || Value ||
    | {{PortName}} | The endpoint name this service is implementing, it maps to the {{wsdl:port@name}}. In the format of {{ns:PORT_NAME}} where {{ns}} is a namespace prefix valid at this scope. |
    | {{serviceName}} | The service name this service is implementing, it maps to the {{wsdl:service@name}}. In the format of {{ns:SERVICE_NAME}} where {{ns}} is a namespace prefix valid at this scope. |
    | {{wsdlURL}} | The location of the WSDL. Can be on the classpath, file system, or be hosted remotely. |
    | {{bindingId}} | The {{bindingId}} for the service model to use. |
    | {{address}} | The service publish address. |
    | {{bus}} | The bus name that will be used in the JAX-WS endpoint. |
    | {{serviceClass}} | The class name of the SEI (Service Endpoint Interface) class which could have JSR181 annotation or not. |
    
    It also supports many child elements:
    || Name || Value ||
    | {{cxf:inInterceptors}} | The incoming interceptors for this endpoint. A list of {{<bean>}} or {{<ref>}}. |
    | {{cxf:inFaultInterceptors}} | The incoming fault interceptors for this endpoint.  A list of {{<bean>}} or {{<ref>}}. |
    | {{cxf:outInterceptors}} | The outgoing interceptors for this endpoint. A list of {{<bean>}} or {{<ref>}}. |
    | {{cxf:outFaultInterceptors}} | The outgoing fault interceptors for this endpoint. A list of {{<bean>}} or {{<ref>}}. |
    | {{cxf:properties}} | A properties map which should be supplied to the JAX-WS endpoint. See below. |
    | {{cxf:handlers}} | A JAX-WS handler list which should be supplied to the JAX-WS endpoint. See below. |
    | {{cxf:dataBinding}} | You can specify the which {{DataBinding}} will be use in the endpoint. This can be supplied using the Spring {{<bean class="MyDataBinding"/>}} syntax. |
    | {{cxf:binding}} | You can specify the {{BindingFactory}} for this endpoint to use.  This can be supplied using the Spring {{<bean class="MyBindingFactory"/>}} syntax. |
    | {{cxf:features}} | The features that hold the interceptors for this endpoint. A list of {{<bean>}}s or {{<ref>}}s |
    | {{cxf:schemaLocations}} | The schema locations for endpoint to use. A list of {{<schemaLocation>}}s |
    | {{cxf:serviceFactory}} | The service factory for this endpoint to use. This can be supplied using the Spring {{<bean class="MyServiceFactory"/>}} syntax |
    {div}

...

NOTE
You can use cxf:properties to set the camel-cxf endpoint's dataFormat and setDefaultBus properties from spring configuration file.

Code Block
xml
xml

<cxf:cxfEndpoint id="testEndpoint" address="http://localhost:9000/router"
     serviceClass="org.apache.camel.component.cxf.HelloService"
     endpointName="s:PortName"
     serviceName="s:ServiceName"
     xmlns:s="http://www.example.com/test">
     <cxf:properties>
       <entry key="dataFormat" value="MESSAGE"/>
       <entry key="setDefaultBus" value="true"/>
     </cxf:properties>
   </cxf:cxfEndpoint>

...

Since camel 2.8 there is support for utilizing aries blueprint dependency injection for your CXF endpoints.
The schema utilized is very similar to the spring schema so the transition is fairly transparent.

Example

Code Block
xml
xml


<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
           xmlns:camel-cxf="http://camel.apache.org/schema/blueprint/cxf"
	   xmlns:cxfcore="http://cxf.apache.org/blueprint/core"
           xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

      <camel-cxf:cxfEndpoint id="routerEndpoint"
                     address="http://localhost:9001/router"
                     serviceClass="org.apache.servicemix.examples.cxf.HelloWorld">
        <camel-cxf:properties>
            <entry key="dataFormat" value="MESSAGE"/>
        </camel-cxf:properties>
     </camel-cxf:cxfEndpoint>

     <camel-cxf:cxfEndpoint id="serviceEndpoint"
			address="http://localhost:9000/SoapContext/SoapPort"
                     serviceClass="org.apache.servicemix.examples.cxf.HelloWorld">
    </camel-cxf:cxfEndpoint>

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <route>
            <from uri="routerEndpoint"/>
            <to uri="log:request"/>
        </route>
    </camelContext>

</blueprint>

...

You can also use the bean references just as in spring

Code Block
xml
xml


<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
           xmlns:jaxws="http://cxf.apache.org/blueprint/jaxws"
           xmlns:cxf="http://cxf.apache.org/blueprint/core"
           xmlns:camel="http://camel.apache.org/schema/blueprint"
           xmlns:camelcxf="http://camel.apache.org/schema/blueprint/cxf"
           xsi:schemaLocation="
             http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
             http://cxf.apache.org/blueprint/jaxws http://cxf.apache.org/schemas/blueprint/jaxws.xsd
             http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd
             ">

    <camelcxf:cxfEndpoint id="reportIncident"
                     address="/camel-example-cxf-blueprint/webservices/incident"
                     wsdlURL="META-INF/wsdl/report_incident.wsdl"
                     serviceClass="org.apache.camel.example.reportincident.ReportIncidentEndpoint">
    </camelcxf:cxfEndpoint>

    <bean id="reportIncidentRoutes" class="org.apache.camel.example.reportincident.ReportIncidentRoutes" />

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <routeBuilder ref="reportIncidentRoutes"/>
    </camelContext>

</blueprint>

...

If you are using some soap client such as PHP, you will get this kind of error, because CXF doesn't add the XML start document "<?xml version="1.0" encoding="utf-8"?>"

Code Block

Error:sendSms: SoapFault exception: [Client] looks like we got no XML document in [...]

...

Or adding a message header for it like this if you are using Camel 2.4.

Code Block

 // set up the response context which force start document
 Map<String, Object> map = new HashMap<String, Object>();
 map.put("org.apache.cxf.stax.force-start-document", Boolean.TRUE);
 exchange.getOut().setHeader(Client.RESPONSE_CONTEXT, map);

...

cxf client API provides a way to invoke the operation with request and response context. If you are using a camel-cxf endpoint producer to invoke the outside web service, you can set the request context and get response context with the following code:

Code Block
java
java

        CxfExchange exchange = (CxfExchange)template.send(getJaxwsEndpointUri(), new Processor() {
             public void process(final Exchange exchange) {
                 final List<String> params = new ArrayList<String>();
                 params.add(TEST_MESSAGE);
                 // Set the request context to the inMessage
                 Map<String, Object> requestContext = new HashMap<String, Object>();
                 requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, JAXWS_SERVER_ADDRESS);
                 exchange.getIn().setBody(params);
                 exchange.getIn().setHeader(Client.REQUEST_CONTEXT , requestContext);
                 exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, GREET_ME_OPERATION);
             }
         });
         org.apache.camel.Message out = exchange.getOut();
         // The output is an object array, the first element of the array is the return value
         Object\[\] output = out.getBody(Object\[\].class);
         LOG.info("Received output text: " + output\[0\]);
         // Get the response context form outMessage
         Map<String, Object> responseContext = CastUtils.cast((Map)out.getHeader(Client.RESPONSE_CONTEXT));
         assertNotNull(responseContext);
         assertEquals("Get the wrong wsdl opertion name", "{http://apache.org/hello_world_soap_http}greetMe",
                      responseContext.get("javax.xml.ws.wsdl.operation").toString());

...

  • Global system property: you can add a system property of "org.apache.camel.component.cxf.streaming" to "false" to turn if off. That sets the global default, but setting the endpoint property above will override this value for that endpoint.

Include Page
Endpoint See Also
Endpoint See Also