Графическое изображение, не отображающее потоковое содержимое в Primefaces
Я использую streamedcontent для рендеринга байта, отправленного из JSF, затем отправляю его как потоковое содержимое следующим образом:
<p:graphicImage value="#{manage.bytesToStreamedContent(car.image)}"/>
где изображение представляет собой массив байтов изображения, хранящегося в базе данных
поддержка bean:
public StreamedContent bytesToStreamedContent(byte[] bytes)
{
InputStream is = new ByteArrayInputStream(bytes);
StreamedContent image = new DefaultStreamedContent (is, "image/jpeg");
return image;
}
Но я не получаю изображение на странице JSF. Я получил это сообщение в журнале сервера:
ПРЕДУПРЕЖДЕНИЕ: JSF1091: для файла dynamiccontent не найден тип mime. Чтобы решить эту проблему, добавьте сопоставление типа mime в приложения web.xml.
и
SEVERE: Error in streaming dynamic resource.
Не могли бы вы помочь мне здесь, я не могу найти полезную информацию об этой проблеме.
PS:
Im, используя следующие библиотеки:
Mojarra 2.1.3
PrimeFaces 3.1.1
Glassfish 3.1
Ответы
Ответ 1
Найдено, где проблема. Проблема не в графическом изображении. Это связано с тем, что графический тег загружается динамически (аналогичная проблема при попытке загрузки из datatable). Динамические изображения не могут отображаться непосредственно в datatable или datagrid. (Временное решение - назначить параметр и вывести изображения из идентификатора).
Однако решение здесь
Ответ 2
Это странная проблема, и я не думаю, что добавление типа mime в web.xml исправит это. Он указан как ошибка в PrimeFaces с целью для 3.2
http://code.google.com/p/primefaces/issues/detail?id=3546
И он также указан как открытая ошибка в Mojarra 2.1.1. Для этой ошибки есть патч, но похоже, что вам придется вручную применить код к источнику Mojarra 2.1.1 и построить его. Можно было бы подумать, что это будет исправлено в 2.1.3, однако Glassfish может иметь свою собственную предварительную реализацию Mojarra, которая все еще находится на более ранней версии, и ваше приложение может использовать это вместо этого.
http://java.net/jira/browse/JAVASERVERFACES-2103
EDIT:
Вы можете просто передать байт [] непосредственно в качестве аргумента для метода, подобного этому. То, что вы можете сделать, это передать идентификатор автомобиля в качестве параметра, а затем извлечь этот автомобиль и извлечь байты из объекта Car. Причина этого заключается в том, что graphicImage
фактически отображается как тег HTML img
, и это происходит в отдельном запросе HTTP из запроса на страницу JSF. Загрузите и установите плагин Firebug для Firefox, и вы увидите, что это происходит, страница запрашивается, а затем последующие запросы для изображений после получения страницы. Из-за этого ViewScoped и RequestScoped beans невозможно получить доступ таким образом, однако параметр запроса может быть передан с необходимой информацией, необходимой для извлечения байтов автомобиля для изображения.
<p:graphicImage value="#{manage.bytesToStreamedContent}">
<f:param name="item_id" value="#{car.id}" />
</p:graphicImage>
Теперь в вашем управляемом объекте bean вы можете получить идентификатор автомобиля, а после получения идентификатора автомобиля вы сможете получить правильный автомобиль.
public StreamedContent getBytesToStreamedContent() {
String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("item_id");
//Now get the car with the id
}
Ответ 3
В общем, не очень хорошая идея создать StreamedContent в getter для графического изображения. Изображение будет отображено в отдельном запросе из остальной части содержимого, то есть переменные, зависящие от итераторов, не будут работать. Это означает, что в соответствующем вызове bytesToStreamedContent массив байтов будет пустым/пустым. Если вы поместите контрольные точки внутри метода, вы, вероятно, увидите, что в последнем вызове нет данных в байтах.
Вам нужно убедиться, что изображение создано, пока вы все еще имеете доступ ко всему требуемому контенту, а затем сохраняете его таким образом, чтобы получить его снова в файле bytesToStreamedContent. Будет ли это исправлять проблему и на самом деле работать для вас, трудно сказать, не видя остальной код. Я бы начал с попытки удалить аргумент массива байтов и вернуть статическое изображение, чтобы подтвердить, что это проблема.