Configuring CDI with Tomcat example
Introduction
Tomcat is not a full-blown EE container so we must include some required libraries in order to enable CDI support. In this tutorial we will cover CDI configuration in Tomcat and also provide a working sample.
This tutorial considers the following software and environment:
- Ubuntu 12.04
- JDK 1.7.0.09
- Weld 1.1.10
- Tomcat 7.0.35
Configuration
Tomcat is not a full-blown EE container so we must include some required libraries in order to enable CDI support. In this tutorial we will be using Weld - the CDI reference implementation. The required Maven dependencies used in this tutorial are the following:
<dependencies> <dependency> <groupId>org.jboss.weld.servlet</groupId> <artifactId>weld-servlet</artifactId> <version>1.1.10.Final</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> </dependencies>
In order to enable CDI we must also place an empty beans.xml file in WEB-INF folder:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> </beans>
The last configuration step is to configure our CDI listener. We do this in web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Tomcat CDI example</display-name> <listener> <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> </listener> </web-app>
The injected bean
Now let's define the bean that will be injected by CDI in our test servlet. Following is the bean interface:
package com.byteslounge.cdi.bean; public interface Service { int doWork(int a, int b); }
Now the bean implementation:
package com.byteslounge.cdi.bean; public class ServiceBean implements Service { @Override public int doWork(int a, int b) { return a + b; } }
A simple test servlet
Now let's define a simple servlet where we will inject our bean:
package com.byteslounge.cdi.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.inject.Inject; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.byteslounge.cdi.bean.Service; @WebServlet(name = "testServlet", urlPatterns = {"/testcdi"}) public class TestServlet extends HttpServlet { private static final long serialVersionUID = 2638127270022516617L; @Inject private Service service; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int a = 2; int b = 3; PrintWriter out = response.getWriter(); out.println("Hello World: " + service.doWork(a, b)); out.close(); } }
Note that the private property service is annotated with @Inject. This means that when the container is initializing the servlet it will look for a Service implementation. It will find our implementation - ServiceBean - and inject it into the servlet.
When we deploy the application in Tomcat and access the servlet mapped URL we will get the following output:
The tutorial source code is available for download at the end of this page.