Почему ServletContext#getRealPath(/) возвращает относительный путь?

У меня есть следующий фрагмент кода:

String path = servletContext.getRealPath("/");

Теперь я получил сообщение об ошибке от пользователя, в котором говорится, что возвращаемый путь не является абсолютным путем. Возвращаемый путь — «usr/local/...» вместо «/usr/local/...'», поэтому getRealPath, похоже, возвращает относительный путь.

Я вижу это, потому что возвращаемый путь записывается в файл журнала.

Мои характеристики:

  • JBoss 4.0.5.GA
  • Красная шляпа EL 4
  • JDK 1.5.0

См. здесь для javadoc


person Jan Hoeve    schedule 10.09.2009    source источник
comment
Вы уверены, что ваш журнал по какой-то причине не просто отбрасывает первый символ? Может быть, вы можете отладить приложение и проверить результат таким образом? Если все это не поможет, вы можете проверить отчеты об ошибках по этой проблеме в Sun.   -  person cjstehno    schedule 11.09.2009
comment
Нет, к сожалению нет. 1: это простой оператор журнала: log.debug(path: + path); 2: Позже в приложении некоторый код пытается найти файл по этому пути: new File(servletContext.getRealPath(/) + ...); вызов file.exists() возвращает false. Хорошая идея, хотя, я проверю отчеты об ошибках.   -  person Jan Hoeve    schedule 11.09.2009
comment
Вы упомянули, что используете JBoss, но какой веб-контейнер? Раньше он поставлялся с Jetty по умолчанию, но теперь я думаю, что Tomcat... вы также можете проверить эту проблему в базе данных ошибок и/или форумах для веб-контейнера, который вы фактически используете, поскольку это их реализация... не думал об этом что раньше.   -  person cjstehno    schedule 11.09.2009


Ответы (1)


Что-то типа

String path = new File(servletContext.getRealPath("/")).getAbsolutePath();

должен решить вашу проблему. (Хотя это не отвечает на ваш вопрос... ;-))

С уважением, Ян

person Jan    schedule 11.09.2009
comment
Я так не думаю :) Скажем, servletContext.getRealPath(/) возвращает 'usr/local/...' новый файл (usr/local/...) будет работать ТОЛЬКО, когда текущим рабочим каталогом является / (root). - person Jan Hoeve; 11.09.2009
comment
Вы пробовали? Он вернет абсолютный файл (это происходит на моем Mac с причалом, работающим как контейнер сервлета) ;-) - person Jan; 12.09.2009
comment
Это возвращается к моему комментарию к вопросу ... Интересно, проблема ли в реализации, поскольку вы только что протестировали в Jetty, а JBoss использует Tomcat, я думаю. Документы и спецификация говорят, что это должно работать, но они должны правильно это реализовать :-) - person cjstehno; 12.09.2009
comment
Насколько я помню, Jboss по умолчанию использует tomcat как веб-контейнер. Вы можете настроить его для использования Jetty. Или просто попробуйте использовать new File(/).getAbsoluteFilePath() в качестве запасного варианта. ;-) - person Jan; 12.09.2009