我想将会话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一起打包,则问题不会发生。
所以,即时问题已经解决但未被理解。
也许有人可以帮我理解?
答案 0 :(得分:3)
如果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类处理。
答案 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>
希望它有所帮助。