Некоторые объекты, установленные @Autowired, всегда равны нулю, другие в порядке.

Я работаю над своим первым проектом Spring и столкнулся с неприятной проблемой.

У меня есть класс с именем «UsernameService», который настроен как bean-компонент в файле dispatcher-servlet.xml:

<bean id="usernameService" class="service.UsernameService" scope="session" >
    <aop:scoped-proxy />
</bean>

и когда этот компонент создается в одном из моих классов (определение компонента:)

<bean id="testController" class="controller.TestController" />

как таковой:

 @Autowired
UsernameService uns;

он работает абсолютно нормально. Однако, когда я пытаюсь сделать то же самое в другом классе, LogController:

<bean id="logController" class="controller.LogController" />

то это не работает, и я получаю следующую ошибку:

СЕРЬЕЗНЫЙ: Servlet.service() для сервлета [диспетчер] в контексте с путем [/flexitime] вызвал исключение [Ошибка обработки запроса; вложенным исключением является java.lang.NullPointerException] с основной причиной java.lang.NullPointerException

Мне удалось (я полагаю) приписать эту ошибку тому факту, что uns на самом деле никогда не устанавливается/не создается и остается нулевым внутри LogController.

Я много гуглил и нашел много «решений», однако пока ни одно из них не сработало.

Спасибо! Джеймс


person ymhr    schedule 11.04.2012    source источник
comment
Как осуществляется доступ к LogController. У вас есть метод с @RequestMapping, который вызывается в ответ на веб-запрос, или вы делаете новый LogController где-то в своем коде?   -  person gkamal    schedule 11.04.2012
comment
Объект не может быть создан new для работы инъекции.   -  person Thorbjørn Ravn Andersen    schedule 11.04.2012
comment
Доступ к @gkamal LogController осуществляется с другого контроллера, и он сам является автосвязанным компонентом: @Autowired (new line) LogController ls. @thorb Я не использую ключевое слово new для инициализации класса.   -  person ymhr    schedule 11.04.2012
comment
Можете ли вы дважды проверить код, чтобы убедиться, что вы действительно используете указанную выше переменную ls (она не была замаскирована какой-либо локальной переменной). Поле @Autowired не будет пустым, если бин был создан весной. Весьма вероятно, что объект logController, к которому вы обращаетесь, не был создан Spring. Вы также можете добавить оператор журнала в конструктор (создайте фиктивный, если у вас его нет) и убедитесь, что он создается только один раз во время инициализации контекста Spring.   -  person gkamal    schedule 11.04.2012
comment
Нет, я не использую никакое другое объявление класса. Я сделал конструктор, как вы предложили, и, насколько я могу судить, он создается только один раз (каждый раз при доступе к странице, но это правильно).   -  person ymhr    schedule 11.04.2012


Ответы (1)


Добавьте атрибут auto-wire к вашему компоненту:

<bean id="usernameService" class="service.UsernameService" scope="session" autowire="byName">
    <aop:scoped-proxy />
</bean>
person Ramesh Kotha    schedule 11.04.2012
comment
Это дает мне ошибку: Attribute 'default-autowire' is not allowed to appear in element 'bean' - person ymhr; 11.04.2012
comment
Обновил его, извините, я должен был заметить это сам :( К сожалению, это все еще не работает. - person ymhr; 11.04.2012