在PostConstruct上调用Initial requests方法。但是,当我上传图像时,有多个调用PreDestroy方法。这意味着,ImageActionBean的视图id对于每个FileUploadEvent都是更改的。因为我认为ViewID在重定向到另一个页面之前不会改变,所以我尝试清除上传文件的临时存储。
如果我上传了三个图像,那么第四次调用PreDestroy方法。所以我才能拿到一份文件。
我的环境
- JBoss 7.1.1 Final
- primefaces-4.0-20130910.075046-7
- omnifaces-1.7.jar
- jboss-jsf-api_2.1_spec-2.0.5.Final.jar堆栈跟踪:
>>>>> Initialization Finished
>>>>> Destroy Finished
>>>>> Destroy Finished
>>>>> Destroy Finished
>>>>> Destroy Finished
<h:form id="attachmentForm" enctype="multipart/form-data">
<p:fileUpload fileUploadListener="#{ImageActionBean.handleProposalAttachment}"
mode="advanced" multiple="true" sizeLimit="3000000" update="attachmentTable"
allowTypes="/(\.|\/)(gif|jpe?g|png)$/" id="proposalAttachment"/>
</h:form>
@ManagedBean(name = "ImageActionBean")
@ViewScoped <-- org.omnifaces.cdi.ViewScoped
public class ImageActionBean implements Serializable {
private List<String> fileList;
@PostConstruct
public void init() {
fileList = new ArrayList<String>();
System.out.println("Initialization Finished");
}
@PreDestroy
public void destory() {
// clear uploaded file from temp storage
System.out.println("Destroy Finished");
}
public List<String> getFileList() {
return fileList;
}
public void handleProposalAttachment(FileUploadEvent event) {
UploadedFile uploadedFile = event.getFile();
String fileName = uploadedFile.getFileName().replaceAll("\\s", "_");
fileList.add(fileName);
//save uploadedFile to temp storage
}
}发布于 2014-01-21 09:15:16
@ViewScoped被设计用于CDI托管bean,而不是JSF。@ManagedBean创建一个JSF,而不是CDI。JSF托管bean工具不支持CDI托管bean作用域,而只支持JSF托管bean作用域。当没有显式声明任何人时,则将实际使用默认范围@RequestScoped。
实际上,bean是一个请求作用域bean,这完全解释了您所观察到的症状。
为了正确地利用OmniFaces CDI @ViewScoped,通过用@Named代替@ManagedBean使bean成为真正的CDI管理bean。
@Named
@ViewScoped
public class ImageActionBean implements Serializable {与具体问题无关的,使用大写字母启动实例变量名完全违背Java命名约定。你实际上是这样做的:
ImageActionBean ImageActionBean = new ImageActionBean();这是绝对不建议的。相反,你应该有效地
ImageActionBean imageActionBean = ImageActionBean();相应地将EL变量更改为#{imageActionBean}。
https://stackoverflow.com/questions/21249417
复制相似问题