JSF 2 - 从二进制数据生成图像

时间:2011-08-29 06:46:09

标签: java jsf-2 primefaces

我正在使用我的JSF 2项目Primefaces 3.0.M2作为主要的资源库。它到目前为止工作得非常好,但是graphicImage组件似乎已被打破。它只渲染图像一次 - 我加载给定的页面,显示图像,当我重新加载同一页面时,图像(streamedcontent)消失了,在我的日志中我只收到一个

29.08.2011 08:39:03 org.primefaces.application.PrimeResourceHandler handleResourceRequest
SCHWERWIEGEND: Error in streaming dynamic resource.

是否还有其他正确/良好/最好的方式来显示二进制数据流中的图像?或者我是否必须创建一个servlet来处理这个问题?

我正在使用

  • Mojarra 2.1.2
  • Primefaces 3.0.M2
  • Spring 3.0.5

2 个答案:

答案 0 :(得分:0)

这听起来像是Managed Bean的StreamedContent属性被重置为null,因为bean正在被销毁并在回发时重新创建。

这可能是因为你的bean是@RequestScoped

尝试将您的bean设置为@ViewScoped@SessionScoped,以便它可以在帖子后面继续存在。

答案 1 :(得分:0)

您可能会发现此stackoverflow线程很有用 - How to use p:graphicImage with StreamedContent within p:dataTable?

但基本上,似乎至少有两件关于p:graphicimage的东西,你必须知道(我不知道为什么素数的官方文档和演示并没有说明这一点,但无论如何)

  1. 您的图片在RENDER_RESPONSE阶段
  2. 期间无法使用
  3. @ViewScoped将无法正常工作
  4. 所以这是适合我的代码

    [1]托管bean是会话范围的,bean属性不是DefaultStreamedContent(不可序列化),而是byte []。

    @ManagedBean
    @SessionScoped
    public class ImageController implements Serializable{
    
        private byte[]      img;
    

    [2]动态图像getter方法是

    public DefaultStreamedContent getContent(){
        FacesContext context = FacesContext.getCurrentInstance();
        if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
            return new DefaultStreamedContent();
        }else{
            if (img == null){
                return new DefaultStreamedContent();
            }else{
                return new DefaultStreamedContent(new ByteArrayInputStream(img), "image/png");
            }
        }
    }