ServletContext getResourceAsStream返回null

时间:2016-09-05 22:36:16

标签: java servlets

我试图从下面的路径获取一个jar作为流,但它总是抛出空指针错误。

以下是我的Servlet代码

response.setContentType("application/jar");

ServletContext ctx = getServletContext();

InputStream is = null;

try {
    ctx.getRealPath("/WEB-INF/jar/teamspace.jar");
    is = ctx.getResourceAsStream("/WEB-INF/jar/teamspace.jar");
    ///WEB-INF/pdf/order.pdf
}catch(Exception e){

    e.printStackTrace();

}
if(is==null){
    System.err.println("it is null");
}

错误在

之下

我已将jar文件放在以下位置

C:\Users\jacksons5\workspace\BeerApp\WebContent\WEB-INF\jar
SEVERE: Servlet.service() for servlet BeerServlet threw exception
java.lang.NullPointerException
    at com.beer.controller.BeerServlet.doPost(BeerServlet.java:87)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:745)

嗨Stdunbar,

我尝试了链接中提供的解决方案,但它不起作用, 仍然显示相同的错误。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub


//response.setContentType("text/html");

    System.out.println("It reached the server");

    //PrintWriter out = response.getWriter();

    String c = request.getParameter("color");


    response.setContentType("application/jar");

    ServletContext ctx = getServletContext();

    InputStream is = null;

    try {
        //ctx.getRealPath("/WEB-INF/jar/teamspace.jar");
     is = ctx.getResourceAsStream("/WEB-INF/teamspace.jar");
//   InputStream inStream = class.getClass().getClassLoader().getResourceAsStream("Web-INF/web.xml");

    // is = class.getClass().getClassLoader().getResourceAsStream("Web-INF/web.xml");
    ///WEB-INF/pdf/order.pdf
    }catch(Exception e){

        e.printStackTrace();

    }

运行此代码时,我仍然得到相同的错误!!!

2 个答案:

答案 0 :(得分:0)

我不确定您的环境中发生了什么 - 您的代码看起来不错。我创建了一个简单的webapp示例,它占用了大部分代码,并按照您尝试的方式提供服务。我已经在Tomcat 8.0.x和8.5.x上验证了它。它确实使用了Maven,但希望它可以满足您的需求。它被保存here - 它仅为源,大小约为6K,并包含一个用于服务的样品罐。同样,您的代码看起来正确,但其他内容必须无效。

首先,您可以将doPost更改为doGet,以便在浏览器中对其进行测试。

答案 1 :(得分:0)

实际上,根据之前的帖子,我尝试了两个代码,一个是放入web-inf,另一个是放入jar文件夹。但两者都不起作用。

嗨Stunbar,

非常感谢您提供示例代码,我在我的工作区中尝试了它。 当我运行代码时,浏览器要求我下载文件,但它实际上下载了0 kb文件。

我的意思是输入流仍然返回null。

弹出请求下载jar文件背后的原因是因为代码中的下面一行

response.setHeader("Content-Disposition", "filename=\"aws-java-sdk-1.11.21.jar\"");

即使我尝试更改以从浏览器中看到它是否在开发人员工具中显示任何错误,但它没有显示任何错误。

它只是在没有问题的情况下下载空文件。

    package com.beer.controller;

import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
//import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


//@WebServlet(urlPatterns="/mmmmbeer")
public class BeerServlet extends HttpServlet {



    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("It reached the server");

        response.setContentType("application/jar");

        ServletContext ctx = getServletContext();

        try (InputStream inputStream = ctx.getResourceAsStream("/WEB-INF/jar/aws-java-sdk-1.11.21.jar") ) {

            System.out.println( "input stream is " + (inputStream == null ? "null" : "not null"));

            response.setHeader("Content-Disposition", "filename=\"aws-java-sdk-1.11.21.jar\"");

            byte[] buffer = new byte[1024];

            for (int length = 0; (length = inputStream.read(buffer)) > 0;) {
                response.getOutputStream().write(buffer, 0, length);
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }








}

在代码中的sysout中,我可以在控制台中看到输入流为null。

我正在运行tomcat V6.0和Windows 8。

我的本​​地工作区保存在

C:\Users\jacksons5\workspace\BeerApp

我还附上了我的工作区

enter link description here

不确定是什么问题,请指教!!!