2010-11-15 3 views
5

Я использую Spring framework (2.5.4) в своем приложении с загрузкой временного плетения, и все работает отлично везде (в весенних бобах, в объектах, отличных от Spring), за исключением случаев, когда я пытаюсь использовать поле autwire в сервлет аннотированный, как @Configurable, то я получаю хороший NullPointerException ...Spring @Autowired in Servlet


@Configurable(dependencyCheck=true) 
public class CaptchaServlet extends HttpServlet{ 
    @Autowired 
    private CaptchaServiceIface captchaService; 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
     super.init(config); 
    // ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext()); 
    // captchaService = (CaptchaServiceIface) ctx.getBean("captchaService"); 
    } 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     Captcha c = captchaService.getCatpcha(); 
     req.getSession().setAttribute("captchaAnswer", c.getAnswer()); 
     resp.setContentType("image/png"); 
     ImageIO.write(c.getImage(), "png", resp.getOutputStream()); 
    } 
} 

<context:load-time-weaver/> 
<context:spring-configured/> 
<context:component-scan base-package="cz.flexibla2" /> 

Любые предложения о том, что я неправильно делаю?

Спасибо.

+1

Я не уверен, но может случиться так, что класс сервлета загружается контейнером сервлетов, а не весенним контейнером. –

+2

@ abhin4v: Идея, связанная с загрузкой во времени, состоит в том, чтобы позволить чему-либо загружать класс, а не только весной. – skaffman

+0

@malejpavouk, каково окончательное решение такого поведения, можете ли вы поделиться им? –

ответ

3

См. Также mailing list discussion и отчет об ошибке в https: // bugs.eclipse.org/bugs/show_bug.cgi?id=317874. Я согласен с тем, что интуитивно аннотацию @Configurable на сервлете должно быть достаточным для указания весеннему фрейму, что сервлет при создании экземпляра будет настроен весной при использовании <context:spring-configured/>. Я также заметил, что желаемое поведение достигается при использовании -javaagent: /path/to/aspectjweaver.jar вместо spring-instrument * .jar или spring-agent.jar. Поднимите вопрос с Spring Jira по адресу https: // jira.springframework.org/browse/SPR. Я считаю, что проблема может заключаться в том, что класс сервлета, а не экземпляр сервлета, но сам класс, загружается до того, как будет вызвана пружина ContextLoaderListener, поэтому весенняя структура не имеет возможности управлять классом сервлета до того, как будет загружен.

Весенняя измерительная техника для ткачества с нагрузкой, по-видимому, основана на возможности преобразования байт-кода класса перед его загрузкой. Если контейнер сервлетов держится за экземпляр объекта класса, который был получен до того, как он был преобразован весной, тогда он (контейнер сервлетов) не сможет создавать экземпляры преобразованного класса и не сможет весить экземпляры инструмента созданный с использованием заводских методов для этого объекта класса.

+0

https://jira.springsource.org/browse/SPR-7801 – malejpavouk

6

Это, скорее всего, потому, что сервлет создается и инициализируется контейнером сервлета, до инициализируется контекст Spring, и это контекст Spring, который обрабатывает временное сотканье.

Является ли ваш товар <context:load-time-weaver/> ручкой внутри сервлета? Весенний контекст/или на уровне webapp? Первый почти наверняка не будет работать (по причинам, указанным выше), но может быть настроена конфигурация уровня webapp (с использованием ContextLoaderListener).

+0

Я использую contextLoaderLister в web.xml ... и кажется, что некоторые компоненты, которые успешно вставляются, создаются до сервлета ... – malejpavouk

+0

контекст: сам тег load-time-weaver находится в файле конфигурации весны .. . Не знаю, важно ли это, но я использую весенний агент для моего кода. – malejpavouk