Versions Compared

Key

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

...

ServiceMix CXF SE

ServiceMix CXF SE component is a JBI Service Engine exposing (annotated) POJO as services on the JBI Bus.

It uses Apache CXF internally to perform service invocations and xml marshaling.

Features:

  • jsr181 JSR-181 annotations
  • jaxb2JAXB2/aegisAegis/xmlbeans XMLBeans databinding
  • wsdl WSDL auto generation
  • java Java proxy support
  • MTOM / attachments support

Installation

...

  • drop the installer zip in an hotdeploy directory monitored by ServiceMix
  • using ant tasks

Maven Archetype

You can use the servicemix-cxf-se-service-unit archetype to create a CXF SE Service Unit (including a simple POJO):

Code Block
mvn archetype:create \
  -DarchetypeGroupId=org.apache.servicemix.tooling \
  -DarchetypeArtifactId=servicemix-cxf-se-service-unit \
  -DarchetypeVersion=2010.01 \
  -DgroupId=your.group.id \
  -DartifactId=your.artifact.id \
  -Dversion=your-version

Deployment

You can deploy Service Units containing a file named xbean.xml for activating consumer and provider endpoints.

This xml file should respect the given syntax, though this is a spring based xml configuration file
See a full example here.  Note that you have to define the cxf-se namespace with

...


<beans xmlns:cxfse="http://servicemix.apache.org/cxfse/1.0">
    ...
</beans>

Endpoint Configuration

The CXF SE endpoint provides a property named pojo. You can expose any POJO which contains the @WebService annotation.

A simple example follows

Any numbers of endpoints can be specified in the xbean.xml file.

As the main purpose is to expose a POJO, you will have to include the needed class files / jars in the service unit and reference them using the following tags in your xbean.xml configuration file:

Code Block
langxml

<classpath>
  <location>.</location>
</classpath>

This will add the content of the location tags (relative to the unzipped service unit) to the classpath. The previous configuration will just add the class files contained in the service unit, as if it is a plain jar.

If you want to embed jars, just use something like

Code Block
langxml

<classpath>
  <location>lib/foo.jar</location>
</classpath>

Endpoint

A few examples:

Code Block
langxml
<cxfse:endpoint>
   <cxfse:pojo>
     <bean class="org.apache.cxf.calculator.CalculatorImpl">
     </bean>
   </cxfse:pojo>
</cxfse:endpoint>

You can use a proxy (see Proxies section of this page):

Code Block
langxml
<cxfse:endpoint>
  <cxfse:pojo>
     <bean class="org.apache.servicemix.cxfse.GreeterImplForClientProxy">
       <property name="calculator">
          <cxfse:proxy service="calculator:CalculatorService" context="#context" type="org.apache.cxf.calculator.CalculatorPortType" />
       </property>
     </bean>
 </cxfse:pojo>
</cxfse:endpoint>

...

You can find a whole context injection test case here

Lightweight mode

The servicemix-cxf-se component can also be configured in a spring/xbean configuration file, for use in an embedded ServiceMix.
Here is an example of such a configuration:

Code Block
langxml

<sm:activationSpec>
  <sm:component>
      <cxfse:component>
      	<cxfse:endpoints>
           <cxfse:endpoint>
              <cxfse:pojo>
                 <bean class="org.apache.cxf.calculator.CalculatorImpl"/>
              </cxfse:pojo>
           </cxfse:endpoint>
      	</cxfse:endpoints>
      </cxfse:component>
  </sm:component>
</sm:activationSpec>


...

...

When using the servicemix.xml configuration file to create cxfse endpoints, you must include the servicemix-cxfse-xxx.jar in your classpath.
You will find this file inside the component installer (./components/servicemix-cxfse-xxx.zip).
Failing this, an IllegalArgumentException will be thrown with the following message:
Component name: xxxxxx is bound to an object which is not a JBI component, it is of type: javax.xml.namespace.QName
or aanother exception with

Proxies

You can create java proxies for JBI endpoints, provided that they expose a WSDL.

...

Info
titleProxy attributes
borderStylesolidbgColor='lightblue'

Name

Type

Description

Required

type

Class

proxy class type

yes

endpoint

String

JBI Endpoint name

no (will be auto-generated if not specified)

interfaceName

QName

Interface QName implemented by the JBI endpoint

no (will be auto-generated if not specified)

service

QName

JBI Service name

no (will be auto-generated if not specified)

mtomEnabled

boolean

Enable MTOM / attachment support

no (defaults to false)

useJBIWrapper

boolean

Specifies if the endpoint expects to receive the JBI wrapper in the message received from the NMR

no (defaults to true,Ignore the value of useSOAPEnvelope if useJBIWrapper is true)

useSOAPEnvelope

boolean

Specifies if the endpoint expects soap messages when useJBIWrapper is false

no (defaults to true)

From a cxfse CXF SE Service Unit, it could be used as following:

...