Java EE 5 / Servlet 2.5将EJB注入ServletFilter

时间:2012-05-29 09:52:20

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

我想将会话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为null。使用的平台是JBoss 5.1 可以从其他EJB或Servlet中正确访问MyBean。

谢谢。


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

该应用程序包含三个工件: - 包含EJB的jar - 包含servlet的战争 - 包含上述

的耳朵

如果我将过滤器打包在jar中,则会出现问题。如果我将它与战争中的servlet一起打包,则问题不会发生。

所以,即时问题已经解决但未被理解。

也许有人可以帮我理解?

2 个答案:

答案 0 :(得分:3)

如果servletEJB都不在单个ear文件中,则必须在注入EJB时使用@EJB(mappedName="name")。查看this post了解详情。

相关链接:Injection from outside modules

当然,Filter有点Servlet,因此被称为“Servlet过滤器”。 ServletFilter都是Web组件,因此属于Web存档.war,而不是Java存档,.jarjar中的过滤器不会被扫描以注入那种注释,并将作为任何其他常规Java类处理。

答案 1 :(得分:0)

我们遇到了类似的问题,我们在Jar中打包了一些@WebFilter@WebListener组件,这些组件没有被加入(注释未被处理)。

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

我们实现了将属性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>

希望它有所帮助。