Primefaces 多文件上载上的新ViewScope Bean实例
我在wildfly中使用primefaces 5.1.7,当同时上传多张图片时出现问题 我创建了多个ViewScope bean实例(使用@PostConstruct中的断点进行测试) xhtml: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
<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;