2014-09-28 20 views
9

Tôi muốn sử dụng @WebServlet chú thích trong một webapp Java EE mà chạy trên Tomcat 8.chú thích @WebServlet không làm việc với Tomcat 8

Tôi đã đọc mà tôi cần phải khai báo Servlet Version 3.1 trong tôi web.xml và Servlet của tôi cần mở rộng HttpServlet. Tôi đã làm tất cả những gì nhưng vẫn còn @WebServlet không hoạt động. Tôi nhận được HTTP 404.

Tôi cũng đã thử cấu hình của mình với metadata-complete="false" trong số web.xml, nhưng vẫn không thành công.

Đây là web.xml và Servlet của tôi.

Mã mẫu hoàn chỉnh có thể được tìm thấy 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(); 
    } 
    } 

} 

Trả lời

15

tôi nhận nó làm việc. Tôi đã phải mở rộng cách tôi bắt đầu máy chủ 8.0.12 Tomcat của tôi.

Tuy nhiên, có ba điều chính mà phải được thực hiện:

  1. web-app version trong web.xml phải có ít nhất 3.0 (tôi đã sử dụng 3,1)
  2. metadata-complete trong web. xml có thể không đúng (default is "false")
  3. classes thư mục phải được thêm vào Tomcat được nhúng trước khi bắt đầu

Dưới đây là một ví dụ cho web.xml file:

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

Đây là cách lớp học chính Tomcat của tôi trông như thế (mà hỗ trợ tại @WebServlet chú thích):

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

Tính năng này hoạt động lần, nhưng lần khác dẫn đến một [ngoại lệ bí ẩn] (https://stackoverflow.com/questions/48979989/). –

0

Thử để thêm mục này:

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

Mặc dù đoạn mã này có thể giải quyết được câu hỏi, [bao gồm cả giải thích] (http://meta.stackexchange.com/questions/114762/explaining-entirely-‌ code-based-answers) thực sự giúp cải thiện chất lượng của bạn bài đăng. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. – NathanOliver

Các vấn đề liên quan