Зачем вообще использовать JNDI? Просто получите Spring ApplicationContext и получите бин от этого.
Предполагая, что вы инициализировали Spring с помощью ContextLoaderListener в своем веб-приложении, вы сможете получить контекст приложения из ServletContext. Оттуда вы можете получить любой боб, который вы объявили весной.
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
Object bean = context.getBean(some.thing.Else.class);
Если вам нужно использовать JDNI, вы можете создать ServletContextListener, который выполняет что-то вроде следующего в contextInitialized ():
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
Object bean = context.getBean(some.thing.Else.class);
Context initCtx = new InitialContext();
Context springCtx = initCtx.createSubcontext("spring");
springCtx.bind("bean", bean);
Тогда вы сможете найти бин Spring в "spring / bean" из InitialContext.
Две вещи на заметку:
Слушатель контекста, вероятно, также должен вызывать initCtx.destroySubcontext ("spring") и в contextDestroy.
Пространство имен java: comp / env доступно только для чтения (по крайней мере, в Tomcat), поэтому вы ничего не можете поместить туда.
Редактор вопроса: Еще пара ясностей ...
Если вы планируете ссылаться на Spring bean-компоненты с помощью ApplicationContext
, то вам нужно ContextLoaderListener
, определенное в вашем файле web.xml. Это должно быть определено перед вашим пользовательским классом слушателя ... вот так:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>
org.example.sandbox.MyCustomServletContextListener
</listener-class>
</listener>
Кроме того, вы можете получить ServletContext
, который getWebApplicationContext
использует от ServletContextEvent
, например:
@Override
public void contextInitialized(ServletContextEvent contextEvent) {
try {
ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(contextEvent.getServletContext());
// get a bean named "myCalendar" from the application context
Calendar cal = (Calendar)appContext.getBean("myCalendar");
// bind via JNDI
Context initialContext = new InitialContext();
Context subCtx = initialContext.createSubcontext("sample");
subCtx.bind("calendar", cal);
} catch (NamingException e) { // ommitted }
}