Primefaces 多文件上载上的新ViewScope Bean实例

Primefaces 多文件上载上的新ViewScope Bean实例,primefaces,Primefaces,我在wildfly中使用primefaces 5.1.7,当同时上传多张图片时出现问题 我创建了多个ViewScope bean实例(使用@PostConstruct中的断点进行测试) xhtml: <h:form enctype="multipart/form-data" prependId="true"> <p:fileUpload fileUploadListener="#{myBean.handleFileUpload}" mode="advanced

我在wildfly中使用primefaces 5.1.7,当同时上传多张图片时出现问题

我创建了多个ViewScope bean实例(使用@PostConstruct中的断点进行测试)

xhtml:

<h:form enctype="multipart/form-data" prependId="true">
    <p:fileUpload fileUploadListener="#{myBean.handleFileUpload}" 
    mode="advanced" auto="true" update="list"
    allowTypes="/(\.|\/)(gif|jpe?g|png)$/" multiple="true"/>
    ...
这种情况大约75%都会发生,但有时一切都很好。知道如何避免这些多个实例吗?

一个可能的解决方案。。。(未测试!!):

您的会话作用域CDI Bean:

...
import javax.enterprise.context.SessionScoped
...

@SessionScoped
public class MySession implements Serializable {

    public void doSomeWork(...) {
        ...
    }

}
...
import javax.inject.Named
import javax.enterprise.context.ConversationScoped
...

@Named
@ConversationScoped
public class MyBean implements Serializable {

    @Inject
    private Conversation conversation;

    @Inject
    private MySession mySession;

    @PostConstruct
    public void init() {
        conversation.begin();
    }

    public void handleFileUpload(FileUploadEvent event) {
        ...
        mySession.doSomeWork(...);
        ...
    }

    public void remove() {
        conversation.end();
    }

}
您的对话范围是CDIBean:

...
import javax.enterprise.context.SessionScoped
...

@SessionScoped
public class MySession implements Serializable {

    public void doSomeWork(...) {
        ...
    }

}
...
import javax.inject.Named
import javax.enterprise.context.ConversationScoped
...

@Named
@ConversationScoped
public class MyBean implements Serializable {

    @Inject
    private Conversation conversation;

    @Inject
    private MySession mySession;

    @PostConstruct
    public void init() {
        conversation.begin();
    }

    public void handleFileUpload(FileUploadEvent event) {
        ...
        mySession.doSomeWork(...);
        ...
    }

    public void remove() {
        conversation.end();
    }

}
和您的控制器:

@Named
public class MyController implements Serializable {

    @Inject
    private MyBean myBean;

    public String doSomethingAfterAllUploadsAreFinished() {
        ...

        myBean.remove();

        return "SUCCESS";
    }

}

viewscoped的导入看起来像什么?导入javax.faces.view.viewscoped;我认为你在混合作用域,你应该使用CDI或faces。。这个答案解释得很好:@hatemaliam-javax.faces.view.ViewScoped正在使用JEE7中的CDI,因此对于Wildfly,我认为版本是正确的。@来自JavaDoc的user1667910:请验证存储在view scope中的任何bean都必须是可序列化和可代理的,如CDI规范Hello中定义的。不幸的是,我需要会话范围bean中包含的信息;您使用javax.enterprise.context.SessionScoped还是javax.faces.bean.SessionScoped注释?在我的示例中,您应该使用javax.enterprise.context.SessionScoped注释。。。那么它应该会工作…-->我已经在下面的答案中更新了这个例子。导入javax.faces.view.ViewScoped;