首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于全方位PreDestroy的多调用ViewScoped方法

基于全方位PreDestroy的多调用ViewScoped方法
EN

Stack Overflow用户
提问于 2014-01-21 04:50:00
回答 1查看 564关注 0票数 0

PostConstruct上调用Initial requests方法。但是,当我上传图像时,有多个调用PreDestroy方法。这意味着,ImageActionBean的视图id对于每个FileUploadEvent都是更改的。因为我认为ViewID在重定向到另一个页面之前不会改变,所以我尝试清除上传文件的临时存储。

如果我上传了三个图像,那么第四次调用PreDestroy方法。所以我才能拿到一份文件。

我的环境

代码语言:javascript
复制
- 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

堆栈跟踪:

代码语言:javascript
复制
>>>>> 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
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。

代码语言:javascript
复制
@Named
@ViewScoped
public class ImageActionBean implements Serializable {

与具体问题无关的,使用大写字母启动实例变量名完全违背Java命名约定。你实际上是这样做的:

代码语言:javascript
复制
ImageActionBean ImageActionBean = new ImageActionBean();

这是绝对不建议的。相反,你应该有效地

代码语言:javascript
复制
ImageActionBean imageActionBean = ImageActionBean();

相应地将EL变量更改为#{imageActionBean}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21249417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档