Tomcat intégré 7 servlet 3.0 annotations ne fonctionne pas

J'ai dépouillé d'un projet de test qui contient une Servlet version 3.0, a déclaré avec des annotations comme suit:

    @WebServlet("/test")
public class TestServlet extends HttpServlet {

    private static final long serialVersionUID = -3010230838088656008L;

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
        response.getWriter().write("Test");
        response.getWriter().flush();
        response.getWriter().close();
    }
}

J'ai aussi un web.xml fichier comme ceci:

<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">

      <servlet>
        <servlet-name>testServlet</servlet-name>
        <servlet-class>g1.TestServlet</servlet-class>
      </servlet>      

      <servlet-mapping>
        <servlet-name>testServlet</servlet-name>
        <url-pattern>/testWebXml</url-pattern>
      </servlet-mapping>

</web-app> 

J'ai essayé de faire un test JUnit l'aide d'Embedded Tomcat 7. Lorsque je démarre le Tomcat Intégré je n'ai accès qu'à la servlet via l'url-pattern déclaré dans web.xml (/testWebXml). Si j'essaie d'y accéder via l'url-pattern déclarés via l'annotation (/test) il sais 404 page non trouvée.

Voici le code de mon test:

    String webappDirLocation = "src/main/webapp/";
    Tomcat tomcat = new Tomcat();
    tomcat.setPort(8080);

    tomcat.addWebapp("/jerseyTest", new File(webappDirLocation).getAbsolutePath());

    tomcat.start();
    tomcat.getServer().await();

Juste pour m'assurer que j'ai mis en place mon projet correctement, j'ai également installé un effectif de Tomcat 7 et déployé la guerre. Cette fois, les deux web.xml url déclarée et annotation url de mon servlet travail ok.

Donc ma question est: est-ce que quelqu'un sait comment faire Tomcat Intégré 7 prendre en compte ma Servlet 3.0 annotations?

Je dois aussi dire que c'est un projet Maven, et la pom.xml contient les dépendances suivantes:

    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-catalina</artifactId>
        <version>7.0.29</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>7.0.29</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jasper</artifactId>
        <version>7.0.29</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.8.1</version>
        <scope>test</scope>
    </dependency>

== Mise à JOUR ==

Voici une question qui semble similaire à ceci (à l'exception de la Servlet 3.0 annotation qui n'est pas le travail, c'est sur Écoute, pas de Servlet), qui a une suggestion de correction:

https://issues.apache.org/bugzilla/show_bug.cgi?id=53903

Je l'ai essayé et ça ne fonctionne pas:

Changé le Tomcat Intégré de code de début d':

String webappDirLocation = "src/main/webapp/";
Tomcat tomcat = new Tomcat();

tomcat.enableNaming();
tomcat.setPort(8080);


Context ctx = tomcat.addWebapp(tomcat.getHost(), "/embeddedTomcat", new File(webappDirLocation).getAbsolutePath());
((StandardJarScanner) ctx.getJarScanner()).setScanAllDirectories(true);

tomcat.start();

tomcat.getServer().await();

D'autres choses que j'ai essayé, sans succès:

  • spécifiquement réglage des métadonnées complètes="false" dans web.xml "web-app" tag

  • mettre à jour les dépendances Maven à la version 7.0.30

  • débogage de l' org.apache.catalina.startup.ContextConfig classe. Il y a du code qui vérifie @WebServlet annotations, c'est juste qu'il n'est jamais exécuté (ligne 2115). Cela peut être un bon moyen d'obtenir à la racine du problème, mais la classe est assez grand, et je n'ai pas le temps de le faire maintenant. Peut-être que si quelqu'un serait disposé à examiner la façon dont cette classe fonctionne et, sous quelles conditions (config) fait-il pour vérifier correctement votre projet classes pour que l'annotation, il pourrait obtenir une réponse valable.

  • Moi aussi, je n'ai pas été en mesure d'obtenir une Servlet 3.0 (annotation) à l'application de travail dans Tomcat intégré 7. Fonctionne très bien lorsque je déroulant à Servlet 2.5, et de mettre ma servlet dans web.xml. J'ai d'abord essayé l'aide d'embedded Jetée 8... mais après se taper la tête contre un mur pour une journée complète, j'ai découvert que le Servlet 3 annotations ne sont disponibles que lorsque vous utilisez le "hightide" Jetée variante (dont je n'arrivais pas à travailler en mode incorporé soit).
  • Tomcat intégré de la documentation est quasi inexistante. L'Éclipse de gens ont à-peu-près à la recherche de documentation de la Jetée, mais il est plein d'énormes lacunes (par exemple, qu'est-ce que "hightide" et quand l'utiliser, comment intégrer la version 8 avec prise en charge de JSP et d'annotation à base de servlet de configuration, etc). Il se sent comme il ya une certaine pièce essentielle du puzzle manquant pour tous de ce genre de choses... je ne suis pas sûr que quelqu'un EST à l'aide de Servlet 3.0 avec n'importe quel de ces servlet moteurs de la droite maintenant.
  • Juste une remarque sur Shivan l'exemple ci-dessus... le problème n'est pas qu'il est l'intégration de l'annotation-config à base web.basé sur xml de config. Même lorsque vous retirez la servlet servlet et cartographie de l'web.xml, annotation déclaré cartographie par lui-même ne fonctionne toujours pas non plus.
  • Curieusement, j'AI eu l'annotation à base de Servlet 3.0 applications en cours d'exécution dans incorporé Jetée 8 via Maven Jetty plugin. Donc il doit y avoir une voie possible pour faire tout ce travail. Cependant, ce scénario est seulement en cours d'exécution du serveur dans un script de build Maven... ce n'est pas la même chose que par programmation intégration d'un Tomcat ou Jetty exemple à l'intérieur d'une application et l'expédition autonome.
  • merci pour l'entrée, cependant l'idée ici était d'éviter la Jetée et l'utilisation de Tomcat.
  • "J'ai découvert que le Servlet 3 annotations ne sont disponibles que lorsque vous utilisez le "hightide" Jetée variante (dont je n'arrivais pas à travailler en mode incorporé soit)." - ce n'est pas précis, peu importe si le but est de ne pas utiliser la jetée puis la jetée de la balise doit être retiré, il est seulement mentionné dans les commentaires de toute façon
  • Je suis très désolé, je n'ai jamais ment pour ajouter cette balise. Retiré maintenant.
  • Voir aussi @WebServlet annotation ne fonctionne pas avec Tomcat 8