graphicimage在Primefaces中不渲染流式内容

时间:2012-03-01 22:13:35

标签: jsf-2 primefaces

我正在使用streamedcontent呈现从JSF发送的字节,然后将其作为流内容发送回如下:

<p:graphicImage value="#{manage.bytesToStreamedContent(car.image)}"/>

其中image是存储在数据库中的图像的字节数组

支持bean:

public StreamedContent bytesToStreamedContent(byte[] bytes)
{
    InputStream is = new ByteArrayInputStream(bytes);
    StreamedContent image = new DefaultStreamedContent (is, "image/jpeg");
    return image;
}

但我没有在JSF页面中获取图像。我在服务器日志中显示了此消息:

警告:JSF1091:找不到文件dynamiccontent的mime类型。要解决此问题,请将mime类型映射添加到应用程序web.xml。

SEVERE: Error in streaming dynamic resource.

你可以帮我解决这个问题吗?我找不到有关这个问题的任何有用信息

PS:

我正在使用以下库:

Mojarra 2.1.3

PrimeFaces 3.1.1

Glassfish 3.1

3 个答案:

答案 0 :(得分:10)

找到问题所在。问题不在于图形图像。这是因为graphicimage标签是动态加载的(尝试从datatable加载时类似的问题)。动态图像无法直接在datatable或datagrid中呈现。 (解决方法是分配一个参数并从id中提取图像)。

但是,解决方案是here

答案 1 :(得分:4)

这是一个奇怪的问题,我不认为将mime-type添加到web.xml会修复它。它被列为PrimeFaces中的一个bug,目标为3.2

http://code.google.com/p/primefaces/issues/detail?id=3546

它也被列为Mojarra 2.1.1中的一个漏洞。有一个针对此bug提交的补丁,但看起来您必须手动将代码应用于Mojarra 2.1.1源并构建它。有人会认为这将在2.1.3中修复,但是,Glassfish可能有自己的预绑定Mojarra实现,仍然是一个版本,你的应用程序可能正在使用它。

http://java.net/jira/browse/JAVASERVERFACES-2103

修改

你可以直接将byte []作为参数传递给类似的方法。你可以做的是将汽车的id作为参数传递,然后检索该汽车并从Car实体获取字节。这是因为graphicImage实际上呈现为HTML img标记,这发生在来自JSF页面请求的单独HTTP请求中。下载并安装适用于Firefox的Firebug插件,您将看到这种情况发生,请求页面,然后在检索页面后对图像发出后续请求。由于无法以这种方式访问​​ViewScoped和RequestScoped bean,因此仍然可以传递请求参数以及检索映像的Car字节所需的必要信息。

<p:graphicImage value="#{manage.bytesToStreamedContent}">
<f:param name="item_id" value="#{car.id}" />
</p:graphicImage>

现在,在您的托管bean属性中,您可以获得汽车ID,并且在获得汽车ID后,您应该能够获得正确的汽车。

public StreamedContent getBytesToStreamedContent() {
  String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("item_id");
  //Now get the car with the id
}

答案 2 :(得分:3)

一般来说,在图形图像的getter中创建StreamedContent并不是一个好主意。图像将在与其他内容的单独请求中获取,这意味着取决于迭代器的变量将不起作用。这意味着在对bytesToStreamedContent的相关调用中,bytes数组将为null / empty。如果在方法中放置断点,您可能会在最后一次调用中看到没有以字节为单位的数据。

您需要确保在仍然可以访问所有需要的内容时生成图像,然后以在bytesToStreamedContent中再次检索它的方式存储它。如果没有看到剩下的代码,这是否能解决问题并实际为你工作很难说。我首先尝试删除字节数组参数并返回静态图像以确认这是问题。