2014-09-28 18 views
9

chcę użyć @WebServlet adnotacji w webapp Java EE, która biegnie na Tomcat 8.@WebServlet adnotacja nie działa z Tomcat 8

Czytałem, że muszę zadeklarować Servlet wersji 3.1 w moim web.xml i że moja Servlet musi przedłużyć HttpServlet. Zrobiłem to wszystko, ale nadal nie działa @WebServlet. Otrzymuję HTTP 404.

Próbowałem również mojej konfiguracji z metadata-complete="false" w moim web.xml, ale nadal nie ma sukcesu.

Oto mój plik web.xml i Servlet.

Pełny kod przykładowy można znaleźć on 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(); 
    } 
    } 

} 

Odpowiedz

15

mam to działa. Musiałem przedłużyć sposób, w jaki uruchomiłem serwer Tomcat 8.0.12.

Niemniej jednak, istnieją trzy główne rzeczy, które należy zrobić:

  1. web-app version w web.xml musi wynosić co najmniej 3,0 (użyłem 3.1)
  2. metadata-complete w internecie. xml może nie być prawdą (default is "false")
  3. classes katalogi muszą być dodane do osadzonego Tomcat przed startem

Oto przykład dla web.xml pliku:

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

ten sposób mój Tomcat Główna klasa wygląda (który obsługuje teraz @WebServlet adnotacji):

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

To działa trochę razy, ale innym razem prowadzi do [tajemniczego wyjątku] (https://stackoverflow.com/questions/48979989/). –

0

Try Aby dodać to:

((StandardJarScanner) context.getJarScanner()).setScanAllDirectories(true); 
+4

Chociaż ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (http://meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers) naprawdę pomaga poprawić jakość twojego stanowisko. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. – NathanOliver

Powiązane problemy