将@ViewScope cdi bean注入JAX-RS资源

时间:2015-03-04 15:15:03

标签: jsf jsf-2 jax-rs cdi omnifaces

我正在使用MyFaces Apache 2.0.3 JSF,WAS 8.0.0.10

目前我正在尝试在 OmniFaces 的库提供的 JSF 2.0 中注入@ViewScope cdi bean @ViewScope。但是我收到一个错误: WebBeans context with scope type annotation @ViewScoped does not exist within current thread。 当我尝试注入@SessionScope cdi bean时,一切正常。

JAX-RS 资源的代码:

@RequestScoped
@Path("/events")
public class CalendarResource implements Serializable {     
    @Inject
    private CalendarBean calendarBean;
    @Inject
    private PropertiesBean propertiesBean;

    @GET
    @Produces("text/plain; charset=utf-8")
    public Response getEvents(@QueryParam("calendarId") String calendarId,
                            @QueryParam("start") String start,
                            @QueryParam("end") String end,
                            @Context SecurityContext securityContext,
                            @Context HttpServletRequest req
                            ) {


        FullCalendar selectedCalendar = calendarBean.getFullCalendar();


        System.out.println(calendarId + " " + start + " " + end + " " + propertiesBean.getUser().getName());


        return null;

    }

我的 CDI bean的代码:

@Named
@ViewScoped
public class CalendarBean implements Serializable {


    @EJB
    private CalendarEJB calendarEJB;

    @Inject
    private PropertiesBean propertiesBean;



    @PostConstruct
    public void init(){
        ...
    }

...
}

我做错了什么?据我所知,我可以在狭窄的范围内注入更广泛的范围。谢谢。

更新:当我将@ViewScope更改为@SessionScoped时,一切都开始奏效了。可能是 OmniFaces 的问题?

1 个答案:

答案 0 :(得分:4)

@ViewScoped与JSF视图绑定,但是在JAX-RS请求中,没有任何方法可以在任何地方使用JSF视图。在JAX-RS请求期间没有恢复JSF视图,因为JAX-RS请求不是通过提交JSF <h:form>来启动的,它保存有关JSF视图状态的信息并将触发FacesServlet恢复观点。

如果在与JSF页面相同的HTTP会话中触发JAX-RS请求,那么

@SessionScoped确实有效。但是我可以理解这个范围太宽泛了。您可能希望传递一个标识当前JSF视图的附加请求参数,并在会话范围bean中获取它的映射(这基本上是JSF视图范围在幕后工作的方式!)。

如果将@ConversationScoped参数传递给JAX-RS请求,则

cid应该有效。

这不是OmniFaces的问题。您将面临与JSF 2.2 @ViewScoped完全相同的问题,因为它与JSF视图绑定在一起。