Доступ к бобам Spring из сервлета в JBoss - PullRequest
24 голосов
/ 22 января 2009

Я хочу написать простой сервлет в JBoss, который будет вызывать метод в бине Spring. Цель состоит в том, чтобы позволить пользователю запустить внутреннюю работу, нажав URL.

Какой самый простой способ получить ссылку на мой компонент Spring в сервлете?

Веб-сервисы JBoss позволяют вам внедрять WebServiceContext в ваш класс сервисов с помощью аннотации @Resource. Есть ли что-нибудь сопоставимое, что работает в простых сервлетах? Веб-сервис для решения этой конкретной проблемы будет использовать кувалду для дробления ореха.

Ответы [ 3 ]

60 голосов
/ 26 марта 2010

Существует гораздо более изощренный способ сделать это. Внутри org.springframework.web.context.support есть SpringBeanAutowiringSupport, что позволяет вам создать что-то вроде этого:

public class MyServlet extends HttpServlet {

  @Autowired
  private MyService myService;

  public void init(ServletConfig config) {
    super.init(config);
    SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
      config.getServletContext());
  }
}

Это заставит Spring искать ApplicationContext, привязанный к этому ServletContext (например, созданный с помощью ContextLoaderListener), и вставлять бины Spring, доступные в этом ApplicationContext.

31 голосов
/ 22 января 2009

Ваш сервлет может использовать WebApplicationContextUtils для получения контекста приложения, но тогда ваш код сервлета будет напрямую зависеть от Spring Framework.

Другое решение - настроить контекст приложения для экспорта bean-компонента Spring в контекст сервлета в качестве атрибута:

<bean class="org.springframework.web.context.support.ServletContextAttributeExporter">
  <property name="attributes">
    <map>
      <entry key="jobbie" value-ref="springifiedJobbie"/>
    </map>
  </property>
</bean>

Ваш сервлет может получить bean-компонент из контекста сервлета, используя

SpringifiedJobbie jobbie = (SpringifiedJobbie) getServletContext().getAttribute("jobbie");
8 голосов
/ 22 января 2009

Я нашел один способ сделать это:

WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
SpringifiedJobbie jobbie = (SpringifiedJobbie)context.getBean("springifiedJobbie");
...