Jetty 9.3.6和Servlet WebAppContext getServletContext()返回null

时间:2015-12-09 06:25:28

标签: servlets web-applications nullpointerexception jetty

我很遗憾,我很遗憾。但我花了最近几天搜索,不幸的是我没有找到一个似乎合适的答案。

我有一个扩展HttpServlet并覆盖init()“not init(ContextConfig)”的Servlet,并且在init()函数中,getServletContext始终返回null。当我使用Springs 4.0.x和Jetty 8.1.x时,情况并非如此。我猜我做错了什么但不知道它是什么。我通常从测试代码中删除了Springs,但它仍然为null。

的web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0"  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">
<servlet>
    <display-name>MyServlet</display-name>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>servlet.MyServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

JavaConfig Starter partial:

            WebAppContext root = new WebAppContext();
        root.setDescriptor("./WEB-INF/web.xml");
        root.setDisplayName("Root Context");
        root.setSessionHandler(sesh); //Persist Session across restarts of context


        root.setHandler(csh);
        root.setMaxFormContentSize(10000000);
        // Cron Servlet
        System.out.println("Checking root ServletContext ");
        if (root.getServletContext() == null) 
            System.out.println("ServletContext is null");

        //ServletHolder test = new ServletHolder(new MyServlet());
        //test.setDisplayName("test");
        //test.setName("test");
        //root.addServlet(test, "/the");


        root.setResourceBase(new File("./jsp").getPath());

        server.setHandler(root);

        //Start the server
        server.start();
        server.join();

和servlet:

package servlet;
import java.io.*;
import org.apache.log4j.Logger;
import javax.servlet.*;
import javax.servlet.http.*;

public class MyServlet extends HttpServlet {

static Logger log = Logger.getLogger(MyServlet.class);

private static final long serialVersionUID = 1L;


public void init() throws ServletException {
    // Initialization code...
    log.info("MyServlet init()");
    super.init();
    ServletContext sc = getServletContext();
    if (sc == null) 
        log.info("54: Conext returned null");
}

public void destroy() {
    log.info("MyServlet destroy()");
}

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    resp.setHeader("Server", "GoAway");
    doProcess(req, resp);
}

public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    resp.setHeader("Server", "GoAway");
    doProcess(req, resp);
}

private void doProcess(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    PrintWriter out = resp.getWriter();
    // setup no cache
    resp.setContentType("text/html");
    resp.getWriter().println("<html><head><META HTTP-EQUIV=\"refresh\" content=\"0;URL=/\"></head><body>\n</body>\n</html>");
    resp.getWriter().close();
    out.close();
    return;
}

protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setHeader("Server", "GoAway");
    resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
}
}

所以这是我从一个更大的应用程序中删除的东西,以弄清楚我做错了什么。所以有些人可能仍然不需要。您可以在Javaconfig中看到我也尝试过在那里创建servlet容器,但结果是一样的。

因此,从Start代码中,servletContext不为null。 但是从MyServlet的init()代码中,它总是返回null。

我真的不确定我做错了什么。

感谢您的帮助。

o FYI包括Jar的

commons-beanutils-1.9.2.jar
commons-codec-1.9.jar
commons-io-2.2.jar
commons-logging-1.2.jar
javax.el-2.2.6.jar
javax.el-api-2.2.5.jar
javax.mail-1.5.3.jar
javax.servlet-api-3.1.0.jar
jetty-http-9.3.6.v20151106.jar
jetty-io-9.3.6.v20151106.jar
jetty-security-9.3.6.v20151106.jar
jetty-server-9.3.6.v20151106.jar
jetty-servlet-9.3.6.v20151106.jar
jetty-util-9.3.6.v20151106.jar
jetty-webapp-9.3.6.v20151106.jar
jetty-xml-9.3.6.v20151106.jar
log4j-1.2.17.jar
org.apache.jasper.glassfish-2.2.2.v201112011158.jar
slf4 j-api-1.7.13.jar
spring-aop-4.2.3.RELEASE.jar
spring-beans-4.2.3.RELEASE.jar
spring-context-4.2.3.RELEASE.jar
spring-context-support-4.2.3.RELEASE.jar
spring-core-4.2.3.RELEASE.jar
spring-expression-4.2.3.RELEASE.jar
spring-tx-4.2.3.RELEASE.jar
spring-web-4.2.3.RELEASE.jar

更新2015.12.10:

所以我用不同的Jetty版本玩了一下。原始代码使用的是8.1.17,我决定将其升级到9.3.6。所以我将它降级到9.3.5,但结果相同。然后我降级到9.2.14,问题得到了解决。所以,这是Jetty 9.3.x中的一个错误(这似乎不太可能,因为有人会使用它)或者9.3它们是一种不同的配置方式。我查找了有关它的文档,因为它显示的方式和我一样。

0 个答案:

没有答案