我正在使用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 的问题?
答案 0 :(得分:4)
@ViewScoped
与JSF视图绑定,但是在JAX-RS请求中,没有任何方法可以在任何地方使用JSF视图。在JAX-RS请求期间没有恢复JSF视图,因为JAX-RS请求不是通过提交JSF <h:form>
来启动的,它保存有关JSF视图状态的信息并将触发FacesServlet
恢复观点。
@SessionScoped
确实有效。但是我可以理解这个范围太宽泛了。您可能希望传递一个标识当前JSF视图的附加请求参数,并在会话范围bean中获取它的映射(这基本上是JSF视图范围在幕后工作的方式!)。
@ConversationScoped
参数传递给JAX-RS请求,则 cid
应该有效。
这不是OmniFaces的问题。您将面临与JSF 2.2 @ViewScoped
完全相同的问题,因为它与JSF视图绑定在一起。