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, как показано ниже. правда
- Второй вариант находится на уровне веб-приложения, обновляя weblogic.xml, как показано ниже: true. Значение набора в веб-приложении имеет приоритет над значением, установленным на уровне домена. Значением по умолчанию этого свойства является false.
Попробуйте начать свой относительный путь с /WEB-INF/
папка с /img/image.png
может находиться в нескольких местах в вашей структуре папок, как вы можете получить абсолютный путь.
Посмотрите в документации о getRealPath ():
Этот метод возвращает ноль, если контейнер сервлета не может преобразовать данный виртуальный путь в реальный путь.
Это означает, что вы должны проверить возвращаемое значение перед его использованием.