我正在使用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
答案 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中再次检索它的方式存储它。如果没有看到剩下的代码,这是否能解决问题并实际为你工作很难说。我首先尝试删除字节数组参数并返回静态图像以确认这是问题。