ExternalContext#getResourceAsStream() возвращает ноль, где разместить файл ресурса?

Я пытаюсь получить файл PNG как InputStream в моем управляемом бобе, как показано ниже:

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
InputStream input = externalContext.getResourceAsStream("/myFile.png");
// input is null.

Тем не менее InputStream всегда ноль. Как это вызвано и как я могу решить это?

1 ответ

Решение

Очевидно, вы поместили ресурс в неправильном месте.

ExternalContext#getResourceAsStream() который делегирует в случае контейнеров сервлетов под крышками ServletContext#getResoruceAsStream(), имеет свой корень в веб-контенте WAR (родительская папка /WEB-INF а также /META-INF таким образом, файлы в нем также доступны), и /META-INF/resources папка всех JAR в /WEB-INF/lib, В случае веб-приложения JSF это обычно XHTML, CSS, JavaScript и файлы изображений.

Другими словами, он возвращает веб-ресурсы. Он не возвращает ресурс файловой системы диска, для этого вам нужно new FileInputStream() вместо. Он также не возвращает ресурс classpath, для этого вам нужно ClassLoader#getResourceAsStream() вместо. У classpath есть корень в ao /WEB-INF/classes, все банки в /WEB-INF/lib и некоторые папки, сконфигурированные для ВМ / сервера, в зависимости от среды выполнения.

В обычной структуре файла веб-контента файл ресурса должен быть расположен именно здесь, чтобы получить его желаемым способом:

WebContent
 |-- META-INF
 |-- WEB-INF
 |    |-- faces-config.xml
 |    `-- web.xml
 |-- myFile.png    <-- Here.
 :
Другие вопросы по тегам