ho un filtro in cui sono dinamicamente classi delle servlet mappatura:Iniettare un EJB in una dinamica mappata 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());
}
}
Poi quando accede un dato mappare il bean non viene iniettato.
@EJB
private I18nManager i18nManager;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
I18nManager i18n = i18nManager; //null
}
Se genero manualmente una mappatura nel web.xml dato EJB sta lavorando in quella servlet. Mi chiedo se il fatto che sto registrando i servlet in fase di esecuzione il contenitore non considera questi servlet come gestiti.
In questo caso, qual è il modo corretto di iniettare gli EJB nei miei servlet senza modificare il modo in cui vengono registrati dinamicamente tramite filtro?
È tramite JNDI l'unico modo per iniettare i miei EJB?
EDIT 1: ho cercato di implementare una classe ServletContextListener
come suggerito da "Will" utilizzando il seguente codice nel web.xml
:
<listener>
<listener-class>com.megafone.web.filter.convention.InitServlet</listener-class>
</listener>
E la parte relativa alla realizzazione:
...
@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());
}
}
...
Sfortunatamente, il contenitore non si inietta gli EJB e rimane il puntatore nullo. Attualmente sto effettuando una ricerca JNDI sicura del tipo personalizzato per il servizio. Ovviamente questo è molto più costoso che usare l'iniezione corretta (correggimi se ho torto, non ho ancora fatto esperimenti sulle prestazioni).
Usando:
Java EE 6
JBoss AS 7.1
Ottima domanda! – acdcjunior