Introduction
Since 3.1.0 release, Apache CXF supports CDI-based deployment inside OSGi container which uses Pax CDI (Contexts and Dependency Injection for OSGi) implementation (https://github.com/ops4j/org.ops4j.pax.cdi). Apache CXF provides the cxf-jaxrs-cdi feature (for easy deployment into OSGi containers such as Apache Karaf) as well as cxf-integration-cdi module, which includes necessary OSGi bundle metadata to be used by Pax CDI.
Installation
For the installation steps, Apache Karaf 3.0.3 is going to be used as it is the most widely used OSGi container. All commands shown below are intended to be executed from Apache Karaf shell. The first step is to install http and Pax CDI features, which is CDI-version dependent.
For CDI 1.1, please use pax-cdi-1.1-web-weld feature:
For CDI 1.2, please use pax-cdi-1.2-web-weld feature:
Next, Apache CXF 3.1.0+ features should be installed:
In order for the bundle to be recognized as web CDI one and use Apache CXF CDI capabilities, it should provide special bundle manifest instructions (f.e. by using maven-bundle-plugin plugin).
</instructions>
...
<Import-Package>
javax.servlet;version="[2.6,4)",
org.apache.cxf.jaxrs;version="[3.1,4)",
org.apache.cxf.cdi;version="[3.1,4)",
*
</Import-Package>
<Require-Capability>
org.ops4j.pax.cdi.extension; filter:="(&(extension=cxf-integration-cdi))",
osgi.extender; filter:="(osgi.extender=pax.cdi)"
</Require-Capability>
<Web-ContextPath>...</Web-ContextPath>
<_wab>src/main/webapp</_wab>
</instructions>
The Require-Capability instruction is very important in order for CDI initialization, discovery and injections to work with Apache CXF. The Web-ContextPath is the context path for this web application to be deployed at. And _wab is the instruction to point out the web.xml file location. Please notice, the application will not be deployed under usual /cxf endpoint (common endpoint for regular Apache CXF services). The reason for that is that Pax Web is used for deployment of web CDI applications.
Web Application Configuration
At the moment, Apache CXF OSGi application should explicitly provide web.xml descriptor with at least CXFCdiServlet defined. For example:
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-name>
<servlet-class>org.apache.cxf.cdi.CXFCdiServlet</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>
Discovery
Pax CDI uses own definition of bean bundles and as such, only bundles which follow these requirements are available for discovery (providers, services and features) and injection (see please https://ops4j1.jira.com/wiki/display/PAXCDI/Getting+Started+for+OSGi+Users for more details).