Java Servlet 过滤器和其他对象和实体管理器的范围

Posted

技术标签:

【中文标题】Java Servlet 过滤器和其他对象和实体管理器的范围【英文标题】:Java Servlet Filters and scope of other Objects and Entity Manager 【发布时间】:2011-06-10 12:30:00 【问题描述】:

我是 JSF、过滤器和 JPA 的新手,并且正在使用 NetBeans 和 Glassfish。

我有一个 JSF 表单,它提交并依次访问一个对象的方法,该方法调用一个外观对象方法来执行数据库查询。 Facade Class 使用注解来声明对 EntityManager 的访问:

@PersistenceContext(unitName = "NAMEOFAPP")
private EntityManager em;

当我尝试从过滤器类(chain.doFilter 之前或之后)调用相同的外观时,外观类和 EntityManager 工作,但是,如果我在过滤器类中实例化我自己的类并调用一个尝试访问 Facade,它没有被实例化,调用它时我得到一个空异常。

那么,如何让我的类访问 Facade/EntityManager?我以与过滤器类中相同的方式声明外观。

@EJB
private MyFacade myFacade;

当所有其他类都已实例化时,为什么我必须新建我的类?

谢谢。

【问题讨论】:

【参考方案1】:

如果使用 JavaEE 6,您将能够使用 @Inject 注入它 - CDI 提供此功能。

如果没有,您必须通过 JNDI 进行查找。

您不应实例化要管理的对象。如果你这样做,他们将不会得到任何注入,包括实体管理器。

【讨论】:

谢谢博卓。我已将该类声明为 ManagedBean,但现在 Glassfish 会抛出 500 错误:javax.naming.NameNotFoundException。如何声明这个 bean,以便在构建时获取它? Ver 3.0.1,在 faces-config.xml 中没有其他的 声明。在 Filter 类中声明我的托管 bean 时,我使用了 @EJB 注释。非常感谢。 如果没有@EJB 注释,注入会失败——我的对象没有被实例化。我是否需要使用@EJB 注释在过滤器类中声明我的 ManagedBean?一个 500 错误,说明它找不到我的 bean - 至少它现在正在寻找它。 @JPC - 通常,您不能在其他任何地方注入 JSF 托管 bean。但是使用 CDI。添加META-INF/beans.xml,您就可以将@Inject 很多东西添加到很多其他东西中。【参考方案2】:

好的,除了向 Bozho 致敬之外,这就是我的工作方式。 在我导入的过滤器类中:

import javax.inject.Inject;

并如下声明我的 Bean:

@Inject
private MyBean myBean;

现在这个对象被注入了。 我还必须创建一个空的 WEB-INF/beans.xml

<beans
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd" />

现在它可以构建并运行而不会引发异常。

【讨论】:

以上是关于Java Servlet 过滤器和其他对象和实体管理器的范围的主要内容,如果未能解决你的问题,请参考以下文章

⭐基于bootstap-Jquery-JSP-Servlet-mysql⭐博客项目——后台用户退出过程和过滤器管理后台的权限验证实现

Java40Filter过滤器:登录案例

为啥 java servlet 不是过滤器? [复制]

Java深入 - Filter过滤器

Java深入 - Filter过滤器

servlet基础