Доступ к компонентам Spring из сервлета в JBoss

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

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

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


person Sophie Gage    schedule 21.01.2009    source источник


Ответы (3)


Ваш сервлет может использовать 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");
person Chin Huang    schedule 21.01.2009
comment
В чем преимущество этого способа, а не использования WebApplicationContextUtils? В любом случае это связано с Spring. - person Elliot; 29.12.2009
comment
Механизм заполнения атрибута контекста сервлета не обязательно должен быть реализован с использованием Spring. Фильтр или другой сервлет, который запускается при запуске, может заполнить атрибут контекста сервлета. - person Chin Huang; 09.01.2010

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

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), и внедрить bean-компоненты Spring, доступные в этом ApplicationContext.

person Oliver Drotbohm    schedule 26.03.2010
comment
В Spring 2.5.x это должно быть SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); который обрабатывает все остальное автоматически. Потрясающий совет, кстати. - person Lajcik; 04.11.2010
comment
Если вам нужно получить доступ к любому из ServletConfig, убедитесь, что вы вызываете super.init(config) в методе инициализации; например public void init (конфигурация ServletConfig) { super.init (config); SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(это, config.getServletContext()); } - person tamsler; 21.06.2011
comment
Существует известный риск состояния гонки при доступе к данным при использовании переменных экземпляра в сервлетах (если вы не следуете SingleThreadModel). Я считаю, что риск все еще существует, если переменная экземпляра подключается автоматически. Ссылка OWASP: owasp.org/index.php/Member_Field_Race_Condition - person Paulo Merson; 26.11.2014

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

WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
SpringifiedJobbie jobbie = (SpringifiedJobbie)context.getBean("springifiedJobbie");
person Sophie Gage    schedule 21.01.2009