我有一个过滤器,其中我正在动态映射servlet类:
@Override
public void init( FilterConfig filterConfig ) throws ServletException {
servletContext = filterConfig.getServletContext();
File directory = getConventionDirectory();
FileSystemInspector fileInspector = new FileSystemInspector();
Set<ActionInfoData> actions = fileInspector.getActions( directory );
for ( ActionInfoData action : actions ) {
servletContext
.addServlet( action.getServletName(), action.getClassName() )
.addMapping( action.getServletMapping() );
}
}
当我访问一个特定的映射时,EJB没有被注入。
@EJB
private I18nManager i18nManager;
@Override
protected void doGet( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
I18nManager i18n = i18nManager; //null
}
如果我在web.xml中手动创建一个映射,那么 EJB 在该servlet中是可以工作的。这让我想知道,如果我在运行时注册 servlets,容器是否不将这些 servlets 视为已托管。
如果是这种情况,注入 EJB 的适当方法是什么,而又不改变它们通过过滤器动态注册的方式?
是通过 JNDI 注入 EJB 的唯一方法吗?
编辑1: 我已经尝试实现了一个ServletContextListener类,如“Will”所建议的,在web.xml中使用以下代码:
<listener>
<listener-class>com.megafone.web.filter.convention.InitServlet</listener-class>
</listener>
以下是相关的实现部分:
...
@Override
public void contextInitialized( ServletContextEvent sce ) {
ServletContext servletContext = sce.getServletContext();
FileSystemInspector fileInspector = new FileSystemInspector();
Set<ActionInfoData> actions = fileInspector.getActions( getConventionDirectory() );
for ( ActionInfoData action : actions ) {
servletContext
.addServlet( action.getServletName(), action.getClassName() )
.addMapping( action.getServletMapping() );
}
}
...
很遗憾,它不能使容器注入EJBs,空指针仍然存在。我正在制作一种自定义类型安全的JNDI查找服务。显然,这比使用正确的注入方式更加昂贵(如果我错了,请纠正我,我还没有进行性能方面的实验)。
使用:
Java EE 6
JBoss AS 7.1
@javax.annotation.ManagedBean
注释(正在动态映射的类)。我的bean没有被注入。我尝试通过在META-INF目录中放置一个空的beans.xml文件来启用CDI。但是当使用@Inject时仍然没有被注入。有什么想法吗?虽然我已经得到了一些信息,但我将进行几个测试。 - Fagner Brack