Embedded Tomcat 7 Servlet 3.0 Anmerkungen funktioniert nicht

Habe ich eine abgespeckte test-Projekt enthält einen Servlet-version 3.0 -, erklärt, mit Anmerkungen wie:

    @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();
    }
}

Ich habe auch eine web.xml Datei etwa so:

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

Ich habe versucht, einen JUnit-test mit Embedded Tomcat 7. Als ich Anfang der Eingebettete Tomcat-kann ich nur Zugriff auf das servlet über den url-pattern erklärt web.xml (/testWebXml). Wenn ich versuche, Zugriff via url-pattern erklärt via annotation (/test) es sais 404-Seite nicht gefunden.

Hier ist der code für meine Tests:

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

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

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

Nur um sicherzugehen, habe ich mein Projekt richtig, ich habe auch installiert eine aktuelle Tomcat 7 und der Bereitstellung des Krieges. Dieses mal, beide web.xml angegebene url und Anmerkungs-url für mein servlet arbeiten ok.

Also meine Frage ist: weiß jemand, wie man Embedded Tomcat 7 berücksichtigt mein Servlet 3.0 annotations?

Ich soll auch angeben, dass es ein Maven-Projekt, und die pom.xml enthält die folgenden Abhängigkeiten:

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

== UPDATE ==

Hier ist ein Problem, das scheint ähnlich wie diese (mit Ausnahme der Servlet-3.0-Anmerkung, die nicht funktioniert ist auf die Zuhörer, nicht-Servlet), die hat einen empfohlenen Update:

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

Ich habe es versucht und es hat nicht funktioniert:

Verändert die Eingebettete Tomcat-start-code:

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();

Andere Dinge, die ich habe versucht, auch ohne Erfolg:

  • speziell Einstellung metadata-complete="false" in web.xml "web-app" tag
  • Aktualisierung der Maven-Abhängigkeiten, version 7.0.30
  • Debuggen der org.apache.catalina.startup.ContextConfig Klasse. Es gibt code, der überprüft, ob @WebServlet Anmerkungen, es ist nur so, dass es nie ausgeführt (Zeile 2115). Dies kann ein guter Weg, um die Wurzel des Problems, sondern die Klasse ist ziemlich groß, und ich habe keine Zeit, dies jetzt zu tun. Vielleicht, wenn jemand bereit wäre, zu schauen, wie diese Klasse funktioniert, und unter welchen Bedingungen (config params) ist es richtig zu überprüfen, der Ihrem Projekt Klassen für die annotation, könnte es sich um eine gültige Antwort.

InformationsquelleAutor der Frage Shivan Dragon | 2012-07-26

Schreibe einen Kommentar