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

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

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

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

Ответ 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 имеет свой корень в a.o. /WEB-INF/classes, все JAR в /WEB-INF/lib и некоторые папки, настроенные на VM/сервер, в зависимости от среды выполнения.

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

WebContent
 |-- META-INF
 |-- WEB-INF
 |    |-- faces-config.xml
 |    `-- web.xml
 |-- myFile.png    <-- Here.
 :