有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    相反,使用JSF FlowScoped可以使用^{}获得非常类似的东西

    来自Ken Finnigan的《JBoss Weld CDI for Java平台》一书:

    The conversation context implementation within Weld was developed to be used specifically with JSF. [...] In CDI 1.1, the tight coupling with JSF will be removed, enabling the conversation context to be used with other web frameworks.

    下面是一个简单的工作示例(受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:grizzlyseems to have problems引起注意

    如果您想要一个关于使用对话范围创建向导的完整示例,请查看this post