我正在努力地尝试从数据库动态加载的 primefaces graphicimage 的某些奇怪行为(在我看来)。
我的情况:
我有一个 viewscoped 控制器,该控制器为我提供了元素列表( MyHeadObject )。这些HeadObject被称为用户可以选择的项目。更改项目时,将重新加载MyHeadObjects列表。每个元素可以具有一个子元素列表( Details )。我将元素显示在p:datatable中,子元素显示在Sub-p:datatable中,该子嵌套在父数据表中,可以使用p:rowexpansion进行扩展。
行为:
第一次显示页面时,我的图像已正确加载。当我打开行扩展时,图像也正确显示。
但是::如果我关闭并重新打开 rowexpansion ,则图像为空。 通过在p:cellEditor(构面输入)中使用p:fileupload,也可以在数据表rowedit事件上编辑图像。当用户进入行编辑模式时,文件上传将正确显示。在关闭rowedit模式(接受或拒绝更改)时,图像也为空。接受更改(或上传新图像)后,数据将正确写入我的数据库。
重新加载页面也无法正确显示图像。图片正确显示的唯一一点是当我通过更改MyHeadObjecs(请参见下文)所在的项目来强制重新加载对象时。
在更改值后,我的对象的其他数据(例如名称/说明)也可以正常显示。如此看来,使用的浏览器(firefox)将图片数据保留在内存中,但无法在ajax事件中刷新它...
我的相关代码段:
我页面的xhtml代码段
<p:dataTable>
[... values of MyHeadObject...]
<p:rowExpansion id="detailExpand">
[... displaying Detail Objects which are nested in MyHeadObject...]
<p:dataTable id="detTable" var="detail" value="#{bauteil.details}"
editable="true" tableStyle="vertical-align: top;"
editMode="row">
<p:ajax event="rowEdit" listener="#{Partcontroller.onDetailEditComplete}"
update=":detailsForm" />
<p:ajax event="rowEditInit"
listener="#{Partcontroller.onDetailEditInit}" />
<p:column style="width:32px; vertical-align: top;">
<p:rowEditor />
<p:rowExpansion />
</p:column>
此图像标记在rowExpansion的第一次打开时呈现。 在第二行rowExpansion或rowEdit之后不再提供该功能。
<p:column id="detailPic" headerText="Bild"
style="vertical-align: top;">
<p:cellEditor>
<f:facet name="output">
<p:graphicImage value="#{detail.picFullsize}" cache="false" />
</f:facet>
<f:facet name="input">
<h:form enctype="multipart/form-data">
<p:fileUpload fileUploadListener="#Partcontroller.uploadDetailPicture}" mode="advanced"/>
</h:form>
</f:facet>
</p:cellEditor>
</p:column>
[... further columns ...]
</p:dataTable>
</p:rowExpansion>
</p:dataTable>
有关我的Bean的其他信息:
@ManagedBean(name = "Partcontroller")
@ViewScoped
public class PartController implements Serializable {
private List<MyHeadObject> projectParts;
public PartController(){
}
@PostConstruct
public void init(){
//LOADS NECCESSARY DATA CORRECTLY
}
public List<MyHeadObject> getProjectParts() {
return projectParts;
}
}
对象“ MyHeadObject”包含一个子元素列表(“详细信息”。这些子元素提供图片,显示为StreamedContent。
public class MyHeadObject implements java.io.Serializable {
public MyHeadObject(){
}
//diffrent getters, setters and also the Detail setter
public Set<Detail> getDetails() {
return this.details;
}
public void setDetails(Set<Detail> details) {
this.details = details;
}
详细信息如下:
public class Detail implements java.io.Serializable {
public Detail() {
this.PicFullsize = new DefaultStreamedContent();
}
public StreamedContent getPicFullsize() {
System.out.println("PicFullSize was requested");
System.out.println(PicFullsize);
if(PicFullsize == null || PicFullsize.getStream() == null) {
if(getDetailBild() != null) {
System.out.println((getDetailBild().length/1000) + " kB");
}
System.out.println("returning null");
return null;
}else {
System.out.println("returning Pic");
return PicFullsize;
}
}
我可以提供的最后信息:所有数据都是通过休眠加载的。在此页面(和其他页面)中正确加载和显示数据。
在此先感谢您的帮助!