【发布时间】:2016-02-01 14:23:21
【问题描述】:
我正在开发一个应用程序,该应用程序使用 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 上进行部署)
谢谢!
【问题讨论】:
-
JAX-RS 和 JSF 是完全独立的框架,有各自不同的用途,无论如何不能在服务器端相互通信。设计失败,可能需要重新考虑。
-
我看到了混合 CDI 和 Rest 服务的各种示例(在 JBoss Weld 的书中也有专门介绍 AngularJS 的最后一章)。我只需要我的流程的一页使用 JavaScript+REST 而不是 JSF 方法。