getServletContext()。getRealPath()在控制器(NPE)中不起作用,但在jsp中工作

时间:2013-03-25 14:24:53

标签: java spring-mvc itext relative-path realpath

我正在尝试将图片添加到我的pdf文件中。图像位于“WebContent / img / image.png”中。首先,我将相对路径保存到字符串,然后将此相对路径转换为实际路径。

String relativeWebPath = "/img/image.png";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
Image image1 = Image.getInstance(absoluteDiskPath);

即便如此

String absoluteDiskPath = getServletContext().getRealPath("/");

不起作用。

当我定义相对路径时,我尝试了一些变体,但无法使它们中的任何一个起作用。当此行String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);尝试执行时,我总是得到nullPointerException。我在相对路径或其他方面做错了吗?我不知道这是否相关,但我使用 Spring

@RequestMapping(value = "/exportPhonebook.html", method = RequestMethod.POST)
public void exportPhonebook(Model model, HttpServletResponse response) {
    try {
        setResponseHeaderPDF(response);
        Document document = new Document();
        ByteArrayOutputStream baosPDF = new ByteArrayOutputStream();
        PdfWriter pdfWriter = null;
        pdfWriter = PdfWriter.getInstance(document, baosPDF);
        PageNumbersEventHelper events = new PageNumbersEventHelper();
        pdfWriter.setPageEvent(events);
        document.open();
        addMetaData(document);
        addTitlePage(document);
        String relativeWebPath = "/img/image.png";
        String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
        Image image1 = Image.getInstance(absoluteDiskPath);
        document.add(image1);
        addContent(document);
        document.close();
        pdfWriter.close();
        OutputStream os = response.getOutputStream();
        baosPDF.writeTo(os);
        os.flush();
        os.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

这是我在jsp中使用它的方式:

<input type="hidden" value="<%=getServletContext().getRealPath("/") %>" name="path">

我将它传递给控制器​​并添加相对路径。

path = path + "img\\image.png";
Image image = Image.getInstance(path);

这很好用。 我不明白为什么这在我的控制器中不起作用。

3 个答案:

答案 0 :(得分:9)

我错过了这个:

ServletContext servletContext = request.getSession().getServletContext();

现在它可以在控制器上运行。

ServletContext servletContext = request.getSession().getServletContext();
String relativeWebPath = "img/image.png";
String absoluteDiskPath = servletContext.getRealPath(relativeWebPath);

答案 1 :(得分:0)

尝试从/WEB-INF/文件夹开始相对路径,因为/img/image.png可以位于文件夹结构中的多个位置,然后你怎么能获得绝对路径。

请参阅有关getRealPath()的文档说明:

  

如果servlet容器无法返回null,则此方法返回null   将给定的虚拟路径转换为真实路径。

这意味着您应该在使用之前检查返回的值。

答案 2 :(得分:0)

http://ananthkannan.blogspot.ru/2009/12/servletcontextgetrealpath-returns-null.html

将webapp部署为WAR时weblogic的另一个奇怪行为。 ServletContext.getRealPath()在部署为WAR时返回null,但在部署为爆炸时可以正常工作。当您仍希望部署为WAR但我们想要解决此问题时,有两种方法可以解决此问题: 1.转到服务器管理控制台 - &gt;域 - &gt; Web应用程序。单击已存档的实际路径的复选框。这应该进入域config.xml,如下所示。                   真正        

  1. 通过更新weblogic.xml,第二个选项处于webapp级别,如下所示:         真正     Web应用程序中set的值优先于域级别设置的值。此属性的默认值为false。