2014-09-28 2 views
9

Я хочу использовать @WebServlet аннотацию в веб-приложение Java EE, который работает на Tomcat 8.@WebServlet аннотаций не работает с Tomcat 8

Я прочитал, что мне нужно объявить Servlet версии 3.1 в моем web.xml и что мой сервлет должен продлить HttpServlet. Я сделал все это, но все же @WebServlet не работает. Я получаю HTTP 404.

Я также пробовал свою конфигурацию с metadata-complete="false" в моем web.xml, но все равно не успел.

Вот мой web.xml и сервлет.

Полный образец кода можно найти 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(); 
    } 
    } 

} 

ответ

15

Я получил это работает. Мне пришлось расширить способ запуска моего сервера Tomcat 8.0.12.

Тем не менее, есть три основные вещи, которые должны быть сделаны:

  1. web-app version в web.xml должен быть не менее 3,0 (я использовал 3.1)
  2. metadata-complete в сети. xml может быть неверным (default is "false")
  3. classes каталоги должны быть добавлены во встроенный Tomcat перед запуском

Вот пример для 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> 

Это как мой основной класс Tomcat выглядит (который теперь поддерживает @WebServlet аннотаций):

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

Это работает раз, но в других случаях приводит к [таинственное исключение] (https://stackoverflow.com/questions/48979989/). –

0

Try чтобы добавить это:

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

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего после. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – NathanOliver

Смежные вопросы