【问题标题】:getServletContext().getRealPath() doesn't work in controller (NPE), but works in jspgetServletContext().getRealPath() 在控制器(NPE)中不起作用,但在 jsp 中起作用
【发布时间】:2013-03-15 02:02:49
【问题描述】:

我正在尝试将图像添加到我的 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);

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

【问题讨论】:

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


    【解决方案1】:

    我错过了这个:

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

    现在它可以通过控制器工作了。

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

    【讨论】:

    • 如果你通过命令行运行spring boot jar,它将不起作用。总是使用 servletContext.getResource(path);使双方兼容。
    【解决方案2】:

    尝试从/WEB-INF/ 文件夹开始您的相对路径,因为/img/image.png 在您的文件夹结构中可以位于多个位置,那么您如何获得绝对路径。

    请参阅有关 getRealPath() 的文档状态:

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

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

    【讨论】:

    • 只是为了确保您没有提供来自 .war 存档的内容,对吗?
    • 尝试通过输出 servletContext.getRealPath("/") 获取您的根目录,然后构建图像文件的相对路径。
    • 我明天会先试试。
    • servletContext.getRealPath("/") 在我的控制器中不起作用,我也得到了 NPE。但是当我把这个&lt;input type="hidden" value="&lt;%=getServletContext().getRealPath("/") %&gt;" name="path"&gt; 放在我的jsp 中,并将它传递给控制器​​时,我得到像这样的绝对路径C:\Documents and Settings\JVlahovic\Desktop\Web aplikacije u javi\WORKSPACE\.metadata\.plugins\org.eclipse.wst.server.core\tmp2\wtpwebapps\phonebook` then I remove this .metadata\.plugins\org.eclipse.wst.server.core\tmp2\wtpwebapps\phonebook` 和添加此phonebook\WebContent\img\image.png 我设法获取图像的路径。
    • 这样行吗?需要根据真实路径找到文件的真实路径。或者只使用 Image.getInstance(absolutepathToYourFile)
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-04-30
      • 1970-01-01
      • 2023-03-09
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多