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 中没有其他的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⭐博客项目——后台用户退出过程和过滤器管理后台的权限验证实现