java将流范围bean注入Jersey REST Web服务
我正在开发一个应用程序,它使用JSF流来管理一个类似向导的活动,该活动可以由登录用户启动
流的一个页面需要用AngularJS编写自定义JavaScript代码,所以我创建了一个小的Jersey REST服务来在AngularJS和bean之间交换数据(显然,只有当用户使用该流页面时才应该调用该服务)
在服务内部,我需要Flowscope 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)
谢谢
# 1 楼答案
相反,使用JSF} 获得非常类似的东西
FlowScoped
可以使用^{来自Ken Finnigan的《JBoss Weld CDI for Java平台》一书:
下面是一个简单的工作示例(受this blog post启发):
进来。xhtml:
警告:使用
@FormParam
:grizzlyseems to have problems引起注意如果您想要一个关于使用对话范围创建向导的完整示例,请查看this post