Попытка получить blob и превратить его в потоковый контент. Я получаю байты, они преобразуются в ByteArrayInputStream и я возвращаю изображение StremedContent, но я постоянно получаю это:p: graphicImage streamContent nullpointer
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/ConfigEmployee] threw exception
java.io.IOException: java.lang.NullPointerException
Caused by: java.lang.NullPointerException
at org.primefaces.application.resource.StreamedContentHandler.handle(StreamedContentHandler.java:56)
... 21 more
линия 56 имеет это: externalContext.setResponseContentType(streamedContent.getContentType());
мне нужно добавить, что поточное содержание возвращается два раза за объект изображения.
боб Изображение:
public Image(byte[] bytes,String name)
{
this.id=new MyDatabase().getLastId("image")+1;
this.name=name;
this.byteData=bytes;
InputStream is=new ByteArrayInputStream(bytes);
this.image = new DefaultStreamedContent(is,"image/png");
}
public StreamedContent getImage()
{
return image;
}
HTML код
<div class="dataTable">
<h:form id="imageList">
<p:dataTable var="img" value="#{imageView.images}" rowKey="#{img.id}" rows="10" lazy="true" paginator="true">
<p:column headerText="Image">
<p:graphicImage style="width:80px; height:80px" value="#{img.image}" />
</p:column>
<p:column width="200" headerText="Name">
<h:outputText value="#{img.name}" />
</p:column>
<p:column width="200" headerText="Edit">
<h:commandButton value="Enter" actionListener="#{imageView.convertImage(img)}" action="Image?faces-redirect=true" />
</p:column>
</p:dataTable>
</h:form>
</div>
Ленивый нагрузка
@Override
public List<Image> load(int first, int pageSize, String sortField, SortOrder sortOrder,
Map<String, Object> filters)
{
db.openDatabase();
ResultSet rs = db.getImage();
List<Image> imgList = new ArrayList<Image>();
try
{
if (rs.last())
this.setRowCount(rs.getRow());
for (rs.absolute(first); rs.next() && first <= (first + pageSize); first++)
{
imgList.add(new Image(rs.getBytes("byteData"), rs.getString("name")));
}
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
db.closeDatabase();
}
return imgList;
}
Primefaces 5,1, JSF 2.2, Tomcat v7.0
Спасибо, я нашел это раньше, но из-за дня я думал об этом как устаревшие. Я хотел бы спросить класс «StudentService», для чего он нужен и что он делает? – FancyPants
StudentService - примерный класс, концепция важна. Компонент в этом примере помечен как область приложения, поэтому существует только один экземпляр. Если вы хотите пометить свой ImageBean как область приложения, вы решите свою проблему, но если оба пользователя посещают вашу страницу, все они будут видеть одно и то же изображение, так как оно будет загружено один раз, а не по запросу. По этой причине в p: graphicImage добавлен уникальный параметр (у вас также есть параметр id), а параметр принимает внутри getImage из контекста запроса. Таким образом, bean-компонент продолжает выполнять запрос по запросу и обслуживает изображения за запрос –
Он работает (на полпути), в html-коде, который я дал ему, отображается либо пустой квадрат, либо значок изображения (тот, который вы получаете, когда нет изображения). Но поскольку у меня есть много изображений, которые вы можете выбрать, нажав кнопку, он отправит на другую страницу с изображением там, но если я захочу вернуться и выбрать другой, когда страница перенаправляет меня, она все еще показывает старую изображение, поэтому мне нужно обновить страницу, чтобы показать новое изображение. Это похоже на то, что страница загружается быстрее, чем создается изображение, но я думаю, что это еще одна проблема. – FancyPants