Anotação do @WebServlet com o Tomcat 7

No meu aplicativo, eu tinha um servlet que era definido assim no web.xml :

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

Depois de passar a usar o Tomcat 7, gostaria de usar a anotação @WebServlet que fará o trabalho.
Aqui está o jeito que eu fiz:

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

E isso não funciona. Alguém poderia me dizer o que eu fiz de errado?

Contanto que você esteja certo de que está usando o Tomcat 7 ou mais recente, o web.xml do webapp deve ser declarado conforme a especificação do Servlet 3.0 para que o Tomcat possa verificar e processar as annotations. Caso contrário, o Tomcat ainda será executado em um modus de fallback correspondente à versão Servlet no web.xml . O suporte para annotations de API do servlet foi adicionado apenas no Servlet 3.0 (Tomcat 7).

Assim, a declaração da raiz do seu web.xml deve ser semelhante a abaixo (certifique-se de remover qualquer DOCTYPE do web.xml também, caso contrário, ele ainda será interpretado como Servlet 2.3!).

  

Além disso, há uma pequena diferença no padrão de URL. O padrão de URL /notifications permitirá que o servlet apenas escute as solicitações exatamente nesse caminho. Ele não entra em solicitações com um caminho extra como /notifications/list ou algo assim. O padrão de URL /notifications/* permitirá que o servlet escute as solicitações com informações de caminho extras também.

A anotação @WebServlet mínima deve ser assim

 @WebServlet("/notifications/*") 

Os demais atributos são opcionais e, portanto, não obrigatórios para que o servlet funcione de maneira igual.

Veja também:

  • Nossa página wiki de servlets

Pode-se também querer verificar se há duas classs com annotations com o mesmo nome:

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

E:

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

Nesse caso, um dos servlets não funcionará. Se você não usar o nome, deixe de fora, como sugere o @BalusC. Eu tenho o estranho comportamento que um dos servlets só funcionava logo após a alteração e compilation, mas não após a compilation sem alterações.

Além disso, para usar essas annotations e compilar seu código, você deve importar a dependência correspondente em seu pom.xml, mas, conforme fornecido, seu servidor compatível com “Servlet 3.0” já tem isso.

  javax.servlet javax.servlet-api 3.0.1 provided