我正在开发一个使用JSF流来管理可由登录用户启动的类似向导的活动的应用程序。
该流程的一页需要使用AngularJS编写的自定义JavaScript代码,因此我创建了一个小型的Jersey REST服务来在AngularJS和bean之间交换数据(显然只有在用户使用该流程页面时才应该调用该服务)。
在服务中我需要FlowScoped bean,但如果我尝试
@Path("rest")
@RequestScoped
public class MyResource {
@Inject
MyFlowScopedBean myFlowScopedBean;
// ...
}
抛出以下异常:
exception java.lang.NullPointerException at com.sun.faces.flow.FlowCDIContext.getCurrentFlow
所以,我正在使用与用户关联的会话范围bean来使用以下解决方法来检索bean:
@Named
@FlowScoped("myFlow")
public class MyFlowScopedBean {
@Inject
UserDataBean userDataBean;
@PostConstruct
public void init() {
userDataBean.setMyFlowScopedBean(this);
}
// ...
}
@Named
@SessionScoped
public class UserDataBean {
private MyFlowScopedBean myFlowScopedBean;
public getMyFlowScopedBean() {
return myFlowScopedBean;
}
public setMyFlowScopedBean(MyFlowScopedBean myFlowScopedBean) {
this.myFlowScopedBean = myFlowScopedBean;
}
// ...
}
@Path("rest")
@RequestScoped
public class MyResource {
@Inject
UserDataBean userDataBean;
private MyFlowScopedBean getMyFlowScopedBean() {
return userDataBean.getMyFlowScopedBean();
}
// ...
}
有更好的方法吗?而且,更重要的是,我应该这样做还是违反一些最佳做法/惯例?
(我正在使用Glassfish 4.1进行部署)
谢谢!
答案 0 :(得分:0)
而是使用JSF FlowScoped
,可以使用ConversationScoped
获得非常相似的内容。
来自Ken Finnigan的“JBoss Weld CDI for Java Platform”一书:
Weld中的对话上下文实现是为了专门用于JSF而开发的。 [...]在CDI 1.1中,将删除与JSF的紧密耦合,使对话上下文能够与其他Web框架一起使用。
这是一个最小的工作示例(受this blog post启发):
@Named("foo")
@ConversationScoped
public class FooBean implements Serializable {
@Inject
Conversation conversation;
public String getConversationId() {
return conversation.getId();
}
@PostConstruct
public void init() {
conversation.begin();
}
// ...
}
@Path("foo")
@ConversationScoped
public class FooResource implements Serializable {
@Inject
FooBean fooBean;
@GET
@Path("myMethod")
public String myMethod() {
// ...
}
}
在.xhtml中:
<script>
var CID = '#{foo.conversationId}'; // <-- EL
$.get('/myApp/foo/myMethod?cid=' + CID);
</script>
警告:使用@FormParam
:灰熊seems to have problems注意它。
如果您想要使用对话范围创建向导的完整示例,请查看this post。