可以将@ManagedBean 作为@ManagedProperty 注入@WebServlet?

Posted

技术标签:

【中文标题】可以将@ManagedBean 作为@ManagedProperty 注入@WebServlet?【英文标题】:Possible to inject @ManagedBean as a @ManagedProperty into @WebServlet? 【发布时间】:2011-05-27 01:02:49 【问题描述】:

在我的 Java EE 6-webapp(在最新的 GlassFish 3.1 上运行)中,我使用 JSF2-ManagedBeans 和 @ManagedProperty 将它们注入到其他 ManagedBeans 中。现在我想知道我是否也可以使用@ManagedProperty@ManagedBean 注入@WebServlet。一些代码:

@WebServlet(name = "vdd")
public class VddServlet extends HttpServlet

  @ManagedProperty(value = "#userIdentity")
  private UserIdentity identity;

ManagedBean 看起来像这样:

@ManagedBean
public class UserIdentity 

  ...

它是这样工作的吗?如果没有,我还有什么其他方法可以将 ManagedBean 注入到 WebServlet 中(没有 CDI,目前这不是一个选项 - 因为 GF 3.1 B32/33 与 OSGi-Java EE 应用程序相结合存在一些问题,但我们时间不够)?

【问题讨论】:

@Vladimir 我刚刚使用 Netbeans 示例应用程序(PetCatalog)进行了测试,创建了一个 Servlet,用 @WebServlet 对其进行了注释,向其中注入了一个 @ManagedBean。在浏览器中打开 servlet 时,不会注入该值,因此它似乎无法以这种方式工作。在这方面需要帮助... 为什么要在 servlet 中注入 bean?如果您只想访问它,可以从FacesContext 访问它 好吧,这是可能的。但是通过注射来做会好得多。没有 CDI 就没有办法做到这一点? 【参考方案1】:

在 servlet 中使用 @ManagedProperty 是不可能的,因为这仅适用于 @ManagedBean 类。此外,注入一个范围比父对象本身更小的对象也是不可能的,因为这也只会导致并发问题。注入器会为此抛出一个运行时异常。 servlet 本质上是应用程序范围的并在所有用户之间共享,您的 UserIdentity bean 似乎是会话范围的。

由于 JSF 在 Servlet API 之上运行并将会话范围的 bean 存储在会话中,您可以在 servlet 中将其作为会话属性获取:

UserIdentity identity = (UserIdentity) request.getSession().getAttribute("userIdentity");

请注意,FacesContext 通常在 FacesServlet 以外的 servlet 中也不可用,因此按照评论中的建议在 servlet 中使用 FacesContext 没有任何意义,只会返回 null

【讨论】:

谢谢!好的,我现在正在为我的会话范围 bean 进行这样的查找。但是我的请求范围的托管 bean 呢?如何从我的 servlet 访问它们? 理论上,它可以作为请求属性使用(在同一行中,应用程序范围的 bean 可以作为 servletcontext 属性使用)。但通常您不会在同一个请求中同时运行本地 servlet 和 facesservlet(因此托管 bean 在 servlet 中为空)。只需将感兴趣的数据作为请求参数传递即可。 好的,所以我的请求范围 bean 应该可以通过调用 request.getServletContext().getAttribute(nameOfRequestScopedManagedBean) 或 request.getAttribute(nameOfRequestScopedManagedBean) 在我的 Servlet 中使用,对吧? 请求范围的 bean 可用作请求属性(通常会返回 null,因为 servlet 通常在不同的请求中运行)。应用程序范围的 bean 可用作 servletcontext(应用程序)属性。现在一切都合乎逻辑和清晰了吗? 好的,谢谢,现在很清楚了。由于 RequestScoped MB 不可访问,我将 RequestScoped bean 转换为 EJB。这样我就可以将@EJB 注入到我的 Servlet 中。

以上是关于可以将@ManagedBean 作为@ManagedProperty 注入@WebServlet?的主要内容,如果未能解决你的问题,请参考以下文章

当发送的请求是 Ajax 请求时,如何从 ManagedBean 重定向?

Java ManagedBean 方法可以返回 null 吗?

JSF2:从 Spring 向 managedbean 注入服务对象?

JSF 如何找到用@ManagedBean 注释的bean?

使用 CDI 而不是 @ManagedBean: UnproxyableResolutionException 因为超类没有无参数构造函数

如何使用manage.py莫名其妙地使用