次のようなアノテーションで宣言されたサーブレットバージョン3.0を含む簡略化されたテストプロジェクトがあります。
@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();
}
}
次のようなweb.xmlファイルもあります。
<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>
Embedded Tomcat 7を使用してJUnitテストを実行しようとしました。EmbeddedTomcatを起動すると、web.xml(/ testWebXml)で宣言されたurl-patternを介してのみサーブレットにアクセスできます。アノテーション(/ test)で宣言されたurl-patternを介してアクセスしようとすると、404ページが見つかりません。
これが私のテストのコードです:
String webappDirLocation = "src/main/webapp/";
Tomcat tomcat = new Tomcat();
tomcat.setPort(8080);
tomcat.addWebapp("/jerseyTest", new File(webappDirLocation).getAbsolutePath());
tomcat.start();
tomcat.getServer().await();
プロジェクトを正しく設定したことを確認するために、実際のTomcat 7もインストールして、戦争を展開しました。今回は、web.xmlで宣言されたURLとサーブレットのアノテーションURLの両方が正常に機能します。
だから私の質問は:Embedded Tomcat 7に私のサーブレット3.0アノテーションを考慮に入れる方法を知っている人はいますか?
また、これはMavenプロジェクトであり、pom.xmlには次の依存関係が含まれていることを述べる必要があります。
<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>
==更新==
これに似ているように見える問題があります(動作していないサーブレット3.0アノテーションがサーブレットではなくリスナーにあることを除いて)、推奨される修正があります:
https://issues.apache.org/bugzilla/show_bug.cgi?id=53903
私はそれを試しましたが、うまくいきませんでした:
EmbeddedTomcatの開始コードを次のように変更しました。
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();
私が試した他のことも成功しませんでした:
具体的には、web.xml「web-app」タグにmetadata-complete="false"を設定します
Mavenの依存関係をバージョン7.0.30に更新する
org.apache.catalina.startup.ContextConfig
クラスのデバッグ。そこに@WebServlet
注釈をチェックするコードがあります、それはそれが決して実行されないということだけです(2115行目)。これは問題の根本を突き止めるための良い方法かもしれませんが、クラスはかなり大きく、今はこれを行う時間がありません。誰かがこのクラスがどのように機能するか、そしてどのような条件下(config params)でそのアノテーションについてプロジェクトのクラスを正しくチェックするかを喜んで見てくれるなら、それは有効な答えを得るかもしれません。