@WebServlet anotación con Tomcat 7

En mi aplicación, tenía un servlet que se definió así en web.xml :

 Notification Servlet NotificationServlet com.XXX.servlet.NotificationServlet 1   NotificationServlet /notification/*  

Después de pasar a utilizar Tomcat 7, me gustaría utilizar la anotación @WebServlet que hará el trabajo.
Esta es la forma en que lo hice:

 @WebServlet( name="NotificationServlet", displayName="Notification Servlet", urlPatterns = {"/notification"}, loadOnStartup=1) public class NotificationServlet extends HttpServlet { 

Y no funciona. ¿Podría alguien decirme qué hice mal?

Siempre que esté seguro de que está utilizando Tomcat 7 o posterior, el web.xml de la aplicación debe declararse conforme a la especificación Servlet 3.0 para que Tomcat escanee y procese las anotaciones. De lo contrario, Tomcat se ejecutará en un modo alternativo que coincida con la versión de Servlet en web.xml . El soporte para las anotaciones de la API de servlet solo se agregó en Servlet 3.0 (Tomcat 7).

Por lo tanto, la statement de raíz de su web.xml debe verse a continuación (asegúrese de eliminar cualquier DOCTYPE de web.xml también, de lo contrario, se interpretará como Servlet 2.3).

  

Además, hay una pequeña diferencia en el patrón de URL. El patrón /notifications URL permitirá que el servlet solo escuche las solicitudes exactamente en esa ruta. No entra en las solicitudes con una ruta adicional como /notifications/list o algo así. El patrón de URL /notifications/* permitirá que el servlet también escuche en solicitudes con información de ruta adicional.

La anotación mínima de @WebServlet debería verse así

 @WebServlet("/notifications/*") 

El rest de los atributos son opcionales y, por lo tanto, no son obligatorios para que el servlet funcione de la misma manera.

Ver también:

  • Nuestra página wiki servlets

También es posible que desee comprobar si hay dos clases con anotaciones con el mismo nombre:

 @WebServlet(name = "Foo", urlPatterns = {"/foo"}) public class Foo extends HttpServlet { //... } 

Y:

 @WebServlet(name = "Foo", urlPatterns = {"/bar"}) public class Bar extends HttpServlet { //... } 

En estos casos, uno de los servlets no funcionará. Si no usa el nombre, déjelo fuera, como sugiere @BalusC. Obtuve el extraño comportamiento de que uno de los servlets solo funcionó justo después de cambiarlo y comstackrlo, pero no después de la comstackción sin cambios.

Además, para usar estas anotaciones y comstackr su código, debe importar la dependencia correspondiente en su pom.xml, pero como se indica, su servidor “Servlet 3.0” ya lo tiene.

  javax.servlet javax.servlet-api 3.0.1 provided