将FlowScoped bean注入Jersey REST Web服务

时间:2016-02-01 14:23:21

标签: java rest jsf jersey cdi

我正在开发一个使用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进行部署)

谢谢!

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