将 @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
。
我正在使用 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
恢复视图。
@SessionScoped
确实会起作用。但是我可以理解这个范围太广了。您可能想要传递一个额外的请求参数来标识当前的 JSF 视图,并在会话范围的 bean 中获取它的映射(这基本上是 JSF 视图范围在幕后工作的方式!)。
cid
参数传递给 JAX-RS 请求,@ConversationScoped
应该可以工作。
这不是 OmniFaces 问题。由于 JSF 2.2 绑定到 JSF 视图的性质,您将面临与 JSF 2.2 完全相同的问题 @ViewScoped
。