2014-11-21 2 views
1

Попытка получить 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

ответ

1

Какова область действия компонента, она должна быть View или Session, и вам придется изменить способ доступа к вашему bean-компоненту. Для динамически создаваемых изображений отправляются два запроса. Один для рендеринга HTML, который отображает тег img. Затем второй, запущенный на основе атрибута src. Модель должна сохранять значения в соответствии с последующими запросами.

все объяснил красиво здесь Display dynamic image from database with p:graphicImage and StreamedContent

+0

Спасибо, я нашел это раньше, но из-за дня я думал об этом как устаревшие. Я хотел бы спросить класс «StudentService», для чего он нужен и что он делает? – FancyPants

+0

StudentService - примерный класс, концепция важна. Компонент в этом примере помечен как область приложения, поэтому существует только один экземпляр. Если вы хотите пометить свой ImageBean как область приложения, вы решите свою проблему, но если оба пользователя посещают вашу страницу, все они будут видеть одно и то же изображение, так как оно будет загружено один раз, а не по запросу. По этой причине в p: graphicImage добавлен уникальный параметр (у вас также есть параметр id), а параметр принимает внутри getImage из контекста запроса. Таким образом, bean-компонент продолжает выполнять запрос по запросу и обслуживает изображения за запрос –

+0

Он работает (на полпути), в html-коде, который я дал ему, отображается либо пустой квадрат, либо значок изображения (тот, который вы получаете, когда нет изображения). Но поскольку у меня есть много изображений, которые вы можете выбрать, нажав кнопку, он отправит на другую страницу с изображением там, но если я захочу вернуться и выбрать другой, когда страница перенаправляет меня, она все еще показывает старую изображение, поэтому мне нужно обновить страницу, чтобы показать новое изображение. Это похоже на то, что страница загружается быстрее, чем создается изображение, но я думаю, что это еще одна проблема. – FancyPants

Смежные вопросы