Подтвердить что ты не робот

Графическое изображение, не отображающее потоковое содержимое в 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

4b9b3361

Ответ 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. Будет ли это исправлять проблему и на самом деле работать для вас, трудно сказать, не видя остальной код. Я бы начал с попытки удалить аргумент массива байтов и вернуть статическое изображение, чтобы подтвердить, что это проблема.