我有一个过滤器,我在其中动态映射 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 中工作。这让我想知道我在运行时注册 servlet 是否容器不认为这些 servlet 是托管的。
如果是这种情况,将 EJB 注入我的 servlet 而不改变它们通过过滤器动态注册的方式的正确方法是什么?
通过 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() );
}
}
...
不幸的是,它不会使容器注入 EJB,并且空指针仍然存在。我目前正在对服务进行自定义类型安全的 JNDI 查找。显然这比使用正确的注入要昂贵得多(如果我错了,请纠正我,还没有做过关于性能的实验)。
使用:
Java EE 6
JBoss AS 7.1