Jsf 将@ViewScope CDIBean注入JAX-RS资源

Jsf 将@ViewScope CDIBean注入JAX-RS资源,jsf,jsf-2,jax-rs,cdi,omnifaces,Jsf,Jsf 2,Jax Rs,Cdi,Omnifaces,我使用的是MyFacesApache2.0.3JSF,WAS8.0.0.10 目前,我正试图在OmniFaces的库提供的JSF2.0中注入@ViewScopeCDIBean。但我有一个错误: 当前线程中不存在范围类型注释为@ViewScoped的WebBeans上下文。 当我尝试注入一个@SessionScopecdibean时,一切正常 myJAX-RS资源的代码: @RequestScoped @Path("/events") public class CalendarResource i

我使用的是MyFacesApache2.0.3JSF,WAS8.0.0.10

目前,我正试图在OmniFaces的库提供的JSF2.0中注入
@ViewScope
CDIBean。但我有一个错误:
当前线程中不存在范围类型注释为@ViewScoped的WebBeans上下文
。 当我尝试注入一个
@SessionScope
cdibean时,一切正常

myJAX-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;

    }
myCDIbean的代码:

@Named
@ViewScoped
public class CalendarBean implements Serializable {


    @EJB
    private CalendarEJB calendarEJB;

    @Inject
    private PropertiesBean propertiesBean;



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

...
}
我做错了什么?一旦我知道,我可以在一个狭窄的范围内注入更广的范围。多谢各位


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

@ViewScoped
绑定到JSF视图,但是在JAX-RS请求期间,任何地方都没有JSF视图。在JAX-RS请求期间不会恢复JSF视图,因为JAX-RS请求不是通过提交JSF
来启动的,JSF
保存了关于JSF视图状态的信息,并将触发
FacesServlet
来恢复视图

如果JAX-RS请求是在与JSF页面相同的HTTP会话中触发的,
@SessionScoped
确实可以工作。但我可以理解,这个范围太广了。您可能希望传递一个标识当前JSF视图的附加请求参数,并在会话作用域bean中获得它的映射(这基本上就是JSF视图作用域在幕后的工作方式!)

如果将
@ConversationScoped
参数传递给JAX-RS请求,那么
@ConversationScoped
应该可以工作


这不是一个全方位的问题。由于JSF 2.2绑定到JSF视图的性质,您将面临与JSF 2.2完全相同的问题。

@ViewScoped
绑定到JSF视图,但是在JAX-RS请求期间,任何地方都没有JSF视图。在JAX-RS请求期间不会恢复JSF视图,因为JAX-RS请求不是通过提交JSF
来启动的,JSF
保存了关于JSF视图状态的信息,并将触发
FacesServlet
来恢复视图

如果JAX-RS请求是在与JSF页面相同的HTTP会话中触发的,
@SessionScoped
确实可以工作。但我可以理解,这个范围太广了。您可能希望传递一个标识当前JSF视图的附加请求参数,并在会话作用域bean中获得它的映射(这基本上就是JSF视图作用域在幕后的工作方式!)

如果将
@ConversationScoped
参数传递给JAX-RS请求,那么
@ConversationScoped
应该可以工作


这不是一个全方位的问题。JSF 2.2
@ViewScoped
也会面临同样的问题,因为它与JSF视图绑定在一起。

谢谢你,巴卢斯克,你的帮助是无价的。谢谢你,巴卢斯克,你的帮助是无价的。