1

我想将会话 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 MyBean 可以从其他 EJB 或 Servlet 正确访问。

谢谢你。


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

该应用程序由三个工件组成: - 一个包含 EJB 的 jar - 一个包含 servlet 的 war - 一个包含上述两者的 ear

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

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

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

4

2 回答 2

3

如果servletEJB不在一个单一的 ear 文件中,则必须@EJB(mappedName="name")在注入 EJB 时使用。查看这篇文章了解更多详情。

相关链接:从外部模块注入

当然Filter是一种Servlet,因此被称为“Servlet Filter”。并且两者Servlet都是FilterWeb 组件,因此属于 Web 存档,.war而不是 Java 存档,.jar. 过滤器jar不会被扫描以注入那种注释,并将被视为任何其他常规 Java 类。

于 2012-05-30T03:15:31.867 回答
1

我们遇到了类似的问题,我们将一些@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>

希望能帮助到你。

于 2016-08-04T06:10:16.007 回答