Tôi có một bộ lọc nơi tôi dinamically lớp servlet mapping:Tiêm một EJB thành một động ánh xạ 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());
}
}
Sau đó, khi tôi truy cập vào một định lập bản đồ EJB không tiêm.
@EJB
private I18nManager i18nManager;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
I18nManager i18n = i18nManager; //null
}
Nếu tôi tự tạo ra một ánh xạ trong web.xml các EJB cho đang làm việc trong servlet đó. Nó làm cho tôi tự hỏi nếu thực tế tôi đang đăng ký các servlet trong thời gian chạy container không xem xét những servlets như quản lý.
Nếu trường hợp đó là cách thích hợp để tiêm các EJB vào các servlet của tôi mà không thay đổi cách chúng được đăng ký thực tế qua bộ lọc?
Có phải thông qua JNDI cách duy nhất để tiêm EJB của tôi không?
EDIT 1: Tôi đã cố gắng thực hiện một lớp ServletContextListener
theo đề nghị của "Sẽ" sử dụng đoạn mã sau trong web.xml
:
<listener>
<listener-class>com.megafone.web.filter.convention.InitServlet</listener-class>
</listener>
Và phần liên quan của việc thực hiện:
...
@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());
}
}
...
Thật không may nó không làm cho các container tiêm EJBs và con trỏ null vẫn còn. Tôi hiện đang thực hiện tra cứu JNDI kiểu tùy chỉnh an toàn cho dịch vụ. Rõ ràng đây là tốn kém hơn nhiều so với việc sử dụng tiêm đúng cách (đúng với tôi nếu tôi sai, đã không thực hiện thí nghiệm nào về hiệu suất).
Sử dụng:
Java EE 6
JBoss AS 7.1
Câu hỏi rất hay! – acdcjunior