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

在我的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-apps相结合,但我们时间紧迫)?

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

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

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

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