【问题标题】:Java EE 5 / Servlet 2.5 inject EJB into ServletFilterJava EE 5 / Servlet 2.5 将 EJB 注入 ServletFilter
【发布时间】:2012-06-03 12:51:19
【问题描述】:

我想将会话 bean 注入到我的 ServletFilter 中,这似乎不起作用。您能告诉我如何实现这一目标吗?

public class MyExample implements Filter {
    @EJB
    private MyBean someEjb;

    @Override
    public void destroy() {
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                     FilterChain filterChain) throws IOException, ServletException{
        someEjb.toString();
    }
}

导致 NullPointerException,因为 myEjb 为空。使用的平台是 JBoss 5.1 可以从其他 EJB 或 Servlet 正确访问 MyBean。

谢谢。


问题已解决(虽然我不知道为什么):

该应用程序由三个工件组成: - 一个包含 EJB 的 jar - 包含 servlet 的战争 - 包含以上两者的耳朵

如果我将过滤器打包到 jar 中,就会出现问题。如果我将它与war中的servlet一起打包,则不会出现问题。

所以,直接的问题解决了,但没有被理解。

也许有人可以帮助我理解这一点?

【问题讨论】:

    标签: java jakarta-ee ejb servlet-filters java-ee-5


    【解决方案1】:

    如果servlet 和EJB 不在一个ear 文件中,则在注入EJB 时必须使用@EJB(mappedName="name")。更多详情请查看this post。

    相关链接:Injection from outside modules

    当然,Filter 有点像Servlet,因此被称为“Servlet 过滤器”。 Servlet 和 Filter 都是 Web 组件,因此属于 Web 归档 .war,而不是 Java 归档 .jar。 jar 中的过滤器不会被扫描以注入那种注解,并且将被视为任何其他常规 Java 类。

    【讨论】:

    • 您好,谢谢您的回答。不幸的是,他们都在同一个耳朵里。
    • @FabianFörster:尝试使用@EJB(beanName="MyBeanImpl")。
    • @FabianFörster:当然,Filter 有点像Servlet,因此称为Servlet Filter。 Servlet 和 Filter 都是 web 组件,因此属于 web 归档,.war,而不是 Java 归档,.jar。
    【解决方案2】:

    我们遇到了类似的问题,我们将一些 @WebFilter 和 @WebListener 组件打包在一个未读取的 Jar 中(未处理注释)。

    目的是告诉容器扫描其他罐子以寻找其他带注释的组件。

    我们实现了将属性 metadata-complete 添加到 web.xml 声明的目标。 示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app  version="3.0" 
              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/web-app_3_0.xsd"
              metadata-complete="false">
      
      ...NORMAL_CONTENT_HERE...
      
    </web-app>

    希望对你有帮助。

    【讨论】:

    • 谢谢!这对我帮助很大。我的问题是,在一个耳朵里有 2 场战争(1 场“真实”,另一场用于测试),而真正的一场,有一个老式的 web.xml,元数据完整 = true。这导致我的 bean 出现奇怪的连接,就像半生不熟的 EJB。
    猜你喜欢
    • 2014-04-25
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2013-06-30
    • 2012-11-11
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多