Автопроводка в сервлете

я хочу использовать весеннюю автопроводку в сервлете, вот мой код:

@Configurable
public class ImageServlet extends HttpServlet {

   @Autowired
   private SystemPropertyDao systemPropertyDao;

   @Override
   public void init() throws ServletException {


   String imagePath = systemPropertyDao.findByID(StaticParam.CONTENT_FOLDER);

}

в то время как SystemPropertyDao аннотируется @Repository

и мой applicationContext.xml:

<context:component-scan base-package="com.basepackage" />
<mvc:annotation-driven />
<context:annotation-config />
<context:spring-configured/>

web.xml:

  <servlet>
    <servlet-name>imageServlet</servlet-name>
    <servlet-class>com.xeno.basepackage.ImageServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>imageServlet</servlet-name>
    <url-pattern>/myimages/*</url-pattern>
  </servlet-mapping>

иногда автопроводка работает, а иногда нет (ссылка на spring bean systemPropertyDao имеет значение null), может ли кто-нибудь сказать мне, если я что-то упустил?


person Mahmoud Saleh    schedule 07.08.2012    source источник
comment
Что вы имеете в виду, говоря, что автопроводка не работает? Например, это не работает в конкретных методах?   -  person Boris Treukhov    schedule 07.08.2012
comment
@Boris Treukhov (ссылка на систему bean-компонентов SpringPropertyDao равна нулю)   -  person Mahmoud Saleh    schedule 07.08.2012
comment
Простите мне мое невежество (что-то вроде удаленного ответа), но какой фактический механизм вы используете для инъекции? Вы где-нибудь вызываете SpringBeanAutowiringSupport.processInjectionBasedOnServletContext()?   -  person Boris Treukhov    schedule 07.08.2012
comment
Если вы настроили сервлет в файле web.xml, его может быть несколько экземпляров.   -  person Stefan    schedule 07.08.2012
comment
@Stefan Lindenberg, да, я настроил сервлет в web.xml, пожалуйста, посмотрите мой обновленный вопрос, есть идеи, как решить этот случай?   -  person Mahmoud Saleh    schedule 07.08.2012
comment
@Борис Треухов, я действительно не понимаю вопросов.   -  person Mahmoud Saleh    schedule 07.08.2012
comment
@Msaleh Не так много способов получить доступ к компонентам Spring из класса сервлета (stackoverflow.com/questions/467235/), так что интересно, какой способ вы выбрали. В простейшем случае вы можете попытаться получить доступ к bean-компоненту перед вызовом SpringBeanAutowiringSupport.processInjectionBasedOnServletContext, поэтому он равен нулю.   -  person Boris Treukhov    schedule 07.08.2012


Ответы (2)


Я следовал решению по следующей ссылке, и оно отлично работает: Access Spring bean-компоненты из сервлета в JBoss

public class MyServlet extends HttpServlet {

  @Autowired
  private MyService myService;

  public void init(ServletConfig config) {
    super.init(config);
    SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
      config.getServletContext());
  }
}
person Mahmoud Saleh    schedule 07.08.2012
comment
большое спасибо. Сначала я использую аннотацию Resource, она не работает, а Autowired работает хорошо. - person hiway; 05.10.2013
comment
Спасибо большое, а почему они конкретно упомянули в jBoss??? Не будет ли это работать в weblogic ?? - person Suryaprakash Pisay; 13.08.2014
comment
Это будет работать в Weblogic и даже в Tomcat! Это только название документации: решение на самом деле опирается на стандартный API-интерфейс сервлета и чистые классы Spring. - person Chucky; 01.04.2015

Удалите аннотацию @Configurable из вашего сервлета и добавьте:

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (this);

в первой строке вашего метода init().

person Stefan    schedule 07.08.2012