Как правильно использовать a4j: mediaOutput для отображения изображений? - PullRequest
2 голосов
/ 06 октября 2011

Используя код ниже, я не могу получить изображение на веб-странице. Я не уверен, правильно ли я понимаю документацию, и я не могу найти никаких проблем с этим кодом.

BEAN

@ManagedBean(name = "imageBean")
@RequestScoped
public class ImageBean {
    public void paint(OutputStream os, Object data) throws IOException {
        BinaryContent content = (BinaryContent) data;
        BufferedImage image = ImageIO.read(new ByteArrayInputStream(content.getContent()));
        ImageIO.write(image, "jpg", os);
    }
}

PAGE

<rich:dataTable value="#{dataProviderBean.aoRequests}" var="item">
    <f:facet name="noData">No messages are available.</f:facet>
    ...
    <rich:column>
        <f:facet name="header">Image data</f:facet>
        <rich:list value="#{item.imageContents}" var="content">
            <a4j:mediaOutput element="img" cacheable="false" session="false"
                createContent="#{imageBean.paint}" value="#{content}" />
        </rich:list>
    </rich:column>
</rich:dataTable>

Ответы [ 2 ]

5 голосов
/ 07 октября 2011

Если у кого-то будет такая же проблема в будущем, вот решение:

Атрибут content, который я вставил в value, - это объект, который содержит двоичные данные изображения.Поскольку он сериализован в URL, его длина слишком велика, и он не работает.Вы должны передать немного id и получить объект в методе рисования.

Example

<rich:dataTable value="#{dataProviderBean.aoRequests}" var="item">
    <f:facet name="noData">No messages are available.</f:facet>
    ...
    <rich:column>
        <f:facet name="header">Image data</f:facet>
        <rich:list value="#{item.imageContents}" var="content">
            <a4j:mediaOutput element="img" cacheable="false" session="false"
                createContent="#{imageBean.paint}" value="#{content.id}" />
        </rich:list>
    </rich:column>
</rich:dataTable>

BEAN

public void paint(OutputStream os, Object data) throws IOException {
    String id = (String) data;
    BinaryContent content = (BinaryContent) getContentById(id);
    os.write(content.getContent());
}
0 голосов
/ 20 марта 2013

ImageBean использует @SessionScoped или @ApplicationScope https://community.jboss.org/thread/168523

...