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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nun habe ich endlich gelöst, indem man im Tomcat7 Quellen, nämlich in der unit-tests, die sich mit EmbeddedTomcat und servlet 3.0 annotations.
Im Grunde genommen, starten Sie Ihre Embedded Tomcat 7, wie dies zu machen, sich bewusst von Ihrem annotierten Klassen:
Der Klarheit halber sollte ich erwähnen, dass diese Werke für eine standard-Maven-Projekt, wo Sie Ihre "web-Ressourcen" (wie statische und dynamische Seiten, das WEB-INF-Verzeichnis usw.) finden Sie in:
[Ihr Projekt-root-Verzeichnis]/src/main/webapp
und Ihre Klasse zusammengestellt, in
[Ihr Projekt-root-Verzeichnis]/target/classes
(so, dass Sie hätten [Ihr Projekt-root-Verzeichnis]/target/classes/[einige Paket]/SomeCompiledServletClass.class)
Für andere Verzeichnisse, layouts, diese Orte müssen entsprechend geändert werden.
==== UPDATE: Embedded Tomcat 8 ====
Dank @kwak für dies bemerkt.
Die APIs haben sich etwas geändert, hier, wie das obige Beispiel änderungen bei der Verwendung von Embedded Tomcat 8:
InformationsquelleAutor der Antwort Shivan Dragon
Angesichts der JNDI-Magie in der snippet, das Sie geschrieben:
könnte man vielleicht einrichten, die gleiche Art der Einträge, die im JNDI selbst?
InformationsquelleAutor der Antwort Ian Roberts