@WebServlet annotation with Tomcat 7

annotations, servlet-3.0, servlets, tomcat7

Solution

Provided that you're sure that you're using Tomcat 7 or newer, the webapp's `web.xml` has to be declared conform Servlet 3.0 spec in order to get Tomcat to scan and process the annotations. Otherwise Tomcat will still run in a fallback modus matching the Servlet version in `web.xml`. The support for servlet API annotations was only added in Servlet 3.0 (Tomcat 7).

So, the root declaration of your `web.xml` must look like below (make sure you remove any `DOCTYPE` from `web.xml` too, otherwise it will still be interpreted as Servlet 2.3!).

<web-app 
    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/web-app_3_0.xsd"
    version="3.0">

Further, there's a minor difference in the URL pattern. The URL pattern `/notifications` will let the servlet only listen on requests on exactly that path. It does not kick in on requests with an extra path like `/notifications/list` or something. The URL pattern `/notifications/*` will let the servlet listen on requests with extra path info as well.

The minimum `@WebServlet` annotation should thus look like this

@WebServlet("/notifications/*")

The rest of attributes are optional and thus not mandatory to get the servlet to function equally.

See also:

- Our servlets wiki page

Problem

In my application, I had a servlet which was defined like this in the web.xml: ``` <servlet> <display-name>Notification Servlet</display-name> <servlet-name>NotificationServlet</servlet-name> <servlet-class>com.XXX.servlet.NotificationServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>NotificationServlet</servlet-name> <url-pattern>/notification/*</url-pattern> </servlet-mapping> ``` After moving to use Tomcat 7, I would like to use the `@WebServlet` annotation that will do the job. Here is the way I did it: ``` @WebServlet( name="NotificationServlet", displayName="Notification Servlet", urlPatterns = {"/notification"}, loadOnStartup=1) public class NotificationServlet extends HttpServlet { ``` And it does not work. Could someone please tell me what I did wrong?

Original source