【问题标题】:ClassLoader.getSystemClassLoader().getResourceAsStream() returns null In Servlet?ClassLoader.getSystemClassLoader().getResourceAsStream() 在 Servlet 中返回 null?
【发布时间】:2023-03-30 03:50:02
【问题描述】:

我的问题可能很模糊。让我详细说明一下。 我的项目目录结构(在 IntelliJ IDEA 中):

Server/--------------------------Module
      src/
          java/-----------------------------------classpath directory
              com.example.demo/
                               HelloServlet.java   ------a servlet respons
                               TestCode.java       ------a servlet that responds to network requests
                               Utils.java          ------a class to test by junit
          resources/------------------------------classpath directory
                    hello.txt------------------------------------------ "hello word" writed in this file

Utils.java,我有以下代码:

public class Utils {
    private static BufferedReader reader = null;
    static{
        try {
            InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("hello.txt");
            reader = new BufferedReader(new InputStreamReader(is));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static String getString() throws IOException {
        return reader.readLine();
    }
}

TestCode.java:

public class TestCode {
    @Test
    public void test() throws IOException {
        System.out.println(Utils.getString());
    }
}

当我运行 test() 方法时,我得到以下控制台输出:

Hello World

这样可以,但是servlet有问题。 在HelloServlet.java,我有以下代码:

@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {
    private String message;

    public void init() {
        message = "init() has invoked.";
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html");
        //NullPointerException throws
        message = Utils.getString();
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>" + message + "</h1>");
        out.println("</body></html>");
    }

    public void destroy() {
    }
}

当我在doGet()方法中调用Utils.getString(),并通过chrome发送GET请求时,servlet会抛出NullPointerException。

java.lang.NullPointerException
    at java.io.Reader.<init>(Reader.java:78)
    at java.io.InputStreamReader.<init>(InputStreamReader.java:72)
    at com.example.demo.Utils.<clinit>(Utils.java:17)
    at com.example.demo.HelloServlet.doGet(HelloServlet.java:20)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)

但是当我对Utils.java 进行一些更改时,如下所示:

 private static BufferedReader reader = null;
    static{
        try {
            //use getClassLoader() instead of getSystemClassLoader()
            InputStream is = Utils.class.getClassLoader().getResourceAsStream("hello.txt");
            reader = new BufferedReader(new InputStreamReader(is));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static String getString() throws IOException {
        return reader.readLine();
    }

然后我通过 chrome 发送一个 GET 请求。“Hello World”将打印在浏览器上。 当我刷新网站(或再次请求 servlet)时,会出现第二个将打印 null 的问题。 为什么?有人可以回答我的问题吗?谢谢

【问题讨论】:

  • 你可以试试:this.getClass().getClassLoader().getResourceAsStream()

标签: tomcat8 servlet-3.0


【解决方案1】:

Apache Tomcat 8 使用多个类加载器:https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

如果你想让你的代码实现独立,使用下面的sn-p:

classLoader = request.getSession().getServletContext().getClassLoader()

根据 JavaEE 文档,您将获得一种可靠的方法来获取“此 ServletContext 表示的 Web 应用程序的类加载器”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2011-07-11
    • 2013-10-02
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多