2016-09-05 117 views
-1

我想从下面的路径获取流作为流的jar,但它总是抛出空指针错误。ServletContext getResourceAsStream返回null

下面是我的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(); 

    } 

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

+0

你让它太难 - 看到[这个答案](http://stackoverflow.com/questions/1108434/howto-load-a-resource-from-web-inf-directory-of-a-web -archive)。 – stdunbar

+0

HI Stdunbar, 我想您所提供的链接,它没有工作不幸的是,我 已经编辑我原来的职位试图链接提供的解决方案后 请帮我解决这个 – Jackson2489

+0

你写的,你尝试访问'/ WEB-INF/jar/teamspace.jar'。为了响应@stdunbar,你写了'/ WEB-INF/teamspace.jar'。真? – JimHawkins

回答

0

我不确定你的环境中发生了什么 - 你的代码看起来不错。我创建了一个简单的Web应用程序示例,其中包含大部分代码并按照您尝试的方式提供服务。我已经在Tomcat 8.0.x和8.5.x上验证了它。它确实使用Maven,但希望它能够帮助您获得所需的位置。它被保存here - 它只是来源,大小约6K,并包括一个样品瓶服务。再一次,你的代码看起来是正确的,但其他东西一定不起作用。

为了让调试起来更简单一点,您可以将doPost更改为doGet,以便可以在浏览器中对其进行测试。

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(); 
     } 
    } 








} 

在你的代码的系统输出,我可以看到输入流为控制台空。

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

我的本地工作区

C:\Users\jacksons5\workspace\BeerApp 

下保持我还附上下面

enter link description here

不知道是什么问题,请指教我的工作空间!

相关问题