p: graphicImage streamContent nullpointer

1

Попытка получить blob и превратить его в потоковое содержимое. Я получаю байты, они преобразуются в ByteArrayInputStream, и я возвращаю изображение StremedContent, но я продолжаю получать следующее:

    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;
    }

Прайс-листы 5.1, JSF 2.2, Tomcat v7.0

Теги:
tomcat
jsf
primefaces

1 ответ

1
Лучший ответ

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

все объяснено красиво здесь. Отображение динамического изображения из базы данных с помощью p: graphicImage и StreamedContent

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню