getServletContext().getRealPath() не работает в контроллере (NPE), но работает в jsp

Я пытаюсь добавить изображение в мой PDF-файл. Изображение находится в "WebContent/img/image.png". Сначала я сохраняю относительный путь в строку, а затем преобразовываю этот относительный путь в реальный путь.

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

Даже это

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

не работает

Я пробовал несколько вариантов, когда определял относительный путь, но не мог заставить ни один из них работать. Я всегда получаю nullPointerException, когда эта строка String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath); пытается выполнить. Я делаю что-то не так с относительным путем или что-то еще? Я не знаю, насколько это актуально, но я использую 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 ответа

Решение

Я скучал по этому:

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

теперь это работает от контроллера.

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

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

Еще одно странное поведение от weblogic, когда webapp развернут как WAR. ServletContext.getRealPath() возвращает ноль при развертывании как WAR, но работает нормально при развертывании в разобранном виде. Есть два способа исправить эту проблему, если вы все еще хотите развернуть как WAR, но хотели бы покончить с этой проблемой: 1. Перейдите в консоль администратора сервера-> Домен-> Веб-приложения. Установите флажок "Включен архивированный реальный путь". Это должно сделать запись в домене config.xml, как показано ниже. правда

  1. Второй вариант находится на уровне веб-приложения, обновляя weblogic.xml, как показано ниже: true. Значение набора в веб-приложении имеет приоритет над значением, установленным на уровне домена. Значением по умолчанию этого свойства является false.

Попробуйте начать свой относительный путь с /WEB-INF/ папка с /img/image.png может находиться в нескольких местах в вашей структуре папок, как вы можете получить абсолютный путь.

Посмотрите в документации о getRealPath ():

Этот метод возвращает ноль, если контейнер сервлета не может преобразовать данный виртуальный путь в реальный путь.

Это означает, что вы должны проверить возвращаемое значение перед его использованием.

Другие вопросы по тегам