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

Inject @ViewScope cdi bean into JAX-RS resource

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

目前我正在尝试在 JSF 2.0 中注入一个 @ViewScope cdi bean,@ViewScope OmniFaces[=36] =] 的图书馆。但我得到一个错误: 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 的问题?

@ViewScoped 绑定到 JSF 视图,但是在 JAX-RS 请求期间,任何地方都无法使用 JSF 视图。在 JAX-RS 请求期间没有恢复 JSF 视图,因为 JAX-RS 请求不是由提交 JSF <h:form> 发起的,该 JSF <h:form> 保存有关 JSF 视图状态的信息并会触发 FacesServlet 恢复视图。

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

@SessionScoped 确实会起作用。但是我可以理解这个范围太广了。您可能想要传递一个额外的请求参数来标识当前的 JSF 视图,并在会话范围的 bean 中获取它的映射(这基本上是 JSF 视图范围在幕后工作的方式!)。

如果将 cid 参数传递给 JAX-RS 请求,

@ConversationScoped 应该可以工作。

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