webentwicklung-frage-antwort-db.com.de

Die @WebServlet-Anmerkung funktioniert nicht mit Tomcat 8

Ich möchte die Annotation @WebServlet in einer Java EE-Webapp verwenden, die auf Tomcat 8 ausgeführt wird. 

Ich habe gelesen, dass ich Servlet Version 3.1 in meinem web.xml deklarieren muss und dass mein Servlet HttpServlet erweitern muss. Ich habe das alles gemacht, aber der @WebServlet funktioniert nicht. Ich bekomme ein HTTP 404. 

Ich habe auch meine Konfiguration mit metadata-complete="false" in meinem web.xml ausprobiert, aber immer noch keinen Erfolg.

Hier ist meine web.xml und mein Servlet. 

Den vollständigen Beispielcode finden Sie auf GitHub .

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
  version="3.1" 
  xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

  <context-param>
    <param-name>facelets.DEVELOPMENT</param-name>
    <param-value>true</param-value>
  </context-param>

  <!-- http://stackoverflow.com/a/7924117/451634 -->
  <!-- Put "-1" to disable this feature -->
  <context-param>
    <param-name>facelets.REFRESH_PERIOD</param-name>
    <param-value>1</param-value>
  </context-param>

  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
  </welcome-file-list>

  <!-- JSF -->
  <listener>
    <listener-class>org.Apache.myfaces.webapp.StartupServletContextListener</listener-class>
  </listener>   

  <!-- CDI -->
  <listener>
    <listener-class>org.Apache.webbeans.servlet.WebBeansConfigurationListener</listener-class>
  </listener>

</web-app>

TestServlet.Java

import Java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "TestServlet", urlPatterns = {"*.serve"})
public class TestServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
          throws ServletException, IOException {
    try (ServletOutputStream out = resp.getOutputStream()) {
      out.write("Hello World".getBytes());
      out.flush();
    }
  }

}
13

Ich habe es zum Laufen gebracht. Ich musste die Art und Weise erweitern, wie ich meinen Tomcat 8.0.12-Server gestartet habe. 

Trotzdem gibt es drei Hauptpunkte, die getan werden müssen:

  1. web-app version in web.xml muss mindestens 3.0 sein ( ich habe 3.1 verwendet)
  2. metadata-complete in web.xml ist möglicherweise nicht wahr (default is "false")
  3. classes-Verzeichnisse müssen vor dem Start zum eingebetteten Tomcat hinzugefügt werden

Hier ist ein Beispiel für die Datei web.xml :

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
  version="3.1" 
  metadata-complete="false"  
  xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>

</web-app>

So sieht meine Tomcat-Hauptklasse aus (die jetzt @WebServlet-Annotationen unterstützt):

public static void main(String[] args) throws Exception {
  String contextPath = "/";
  String webappDirLocation = "src/main/webapp/";
  String baseDirectory = new File(webappDirLocation).getAbsolutePath();

  Tomcat tomcat = new Tomcat();
  Tomcat.setPort(8080);
  StandardContext context = (StandardContext) Tomcat.addWebapp(contextPath, baseDirectory);

  // Additions to make @WebServlet work
  String buildPath = "target/classes";
  String webAppMount = "/WEB-INF/classes";

  File additionalWebInfClasses = new File(buildPath);
  WebResourceRoot resources = new StandardRoot(context);
  resources.addPreResources(new DirResourceSet(resources, webAppMount, additionalWebInfClasses.getAbsolutePath(), contextPath));
  context.setResources(resources);
  // End of additions

  Tomcat.start();
  Tomcat.getServer().await();
}
20

Wie wäre es mit @ServletComponentScan?

Beispiel aus http://www.baeldung.com/spring-servletcomponentscan

@ServletComponentScan
@SpringBootApplication
public class SpringBootAnnotatedApp {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootAnnotatedApp.class, args);
    }
}
0
Αλέκος

Versuchen Sie, dies hinzuzufügen:

((StandardJarScanner) context.getJarScanner()).setScanAllDirectories(true);
0
Magno C