Почему я не могу внедрить объект Spring Environment в свой компонент?

У меня есть следующая проблема в приложении Java, использующем структуру Spring.

Итак, у меня есть следующая ситуация, в файле конфигурации root-context.xml у меня есть эта конфигурация bean-компонента:

<!-- Definition for datiPianiInterventiDaoImpl bean -->
   <bean id="datiPianiInterventiDaoImpl" class="it.myCompany.myclient.batch.dao.DatiPianiInterventiDaoImpl">
      <property name="dataSource"  ref="dataSource" />    
   </bean>  

Итак, он отлично работает, и этот bean-компонент правильно создан и работает нормально.

Проблема в том, что теперь в этот компонент мне нужно внедрить экземпляр класса org.springframework.core.env.Environment Spring.

Поэтому я пытаюсь сделать так:

public class DatiPianiInterventiDaoImpl implements DatiPianiInterventiDao {

    @Autowired
    private Environment env;

    ...................................................
    ...................................................
    ...................................................
}

Но, похоже, это не сработает, потому что при выполнении приложения значение Environment env равно null.

@Autowired активирован, потому что я использую эту аннотацию в других классах моего проекта.

Так в чем может быть проблема? Я думаю, что, возможно, это может зависеть от того факта, что я определяю свой компонент, имеющий id="datiPianiInteventiDaoImpl", в свой root-context.xml (и здесь я также определяю зависимость для внедрения в этот компонент).

Так что, может быть, я не могу смешивать внедрение XML-зависимостей с использованием @Autowired?

Что случилось? Что мне не хватает? Как я могу правильно внедрить экземпляр Environment в этот класс?


person AndreaNobili    schedule 23.02.2016    source источник
comment
Где находится «Окружающая среда»?   -  person Abdelhak    schedule 23.02.2016
comment
Он не может быть нулевым, если только вы сами не создаете экземпляры объектов или не включили обработку аннотаций. (то есть иметь либо <context;annotation-config />, либо <context:component-scan />.   -  person M. Deinum    schedule 23.02.2016


Ответы (2)


Возможные причины того, что Environment имеет значение null:

  • Вам не хватает аннотации @Component/@Service поверх класса Environemnet.
  • Вы создали где-то экземпляр класса DatiPianiInterventiDaoImpl, используя новый оператор.
  • Ваша запись: соответствует надлежащей базе пакетов?
  • Я предполагаю, что annotation-config присутствует, поскольку @Autowired работает в другом месте.
  • Попробуйте аннотировать свой DatiPianiInterventiDaoImpl с помощью @Service
person mlewandowski    schedule 23.02.2016
comment
Это странно, аннотируя DatiPianiInterventiDaoImpl с помощью службы (вместо конфигурации XML), автоподключение переменной Environment env работает нормально, но использование конфигурации XML и смешивание с аннотацией Autowire не - person AndreaNobili; 23.02.2016
comment
Рад, что смог помочь. Голосуйте :) - person mlewandowski; 23.02.2016
comment
Нет, это не так. Потому что у вас есть компонентное сканирование в другом контексте, которое теперь подберет bean-компонент и сделает инъекцию. <context:annotation-config /> или <context:component-scan /> должны быть в одном контексте. Если вы определяете этот дао в корне (ContextLoaderListener) и имеете сканирование в своем DispatcherServlet (или наоборот), аннотации не будут работать. - person M. Deinum; 23.02.2016
comment
Просто и в то же время исчерпывающе. Моя проблема заключалась в том, что я где-то использовал новый оператор для создания экземпляра своего класса. - person Zwakele Mgabhi; 22.05.2019

Нет проблем смешивать внедрение XML-зависимостей с использованием @Autowired. Пока ваш bean-компонент сканируется фабрикой bean-компонентов Spring, это допустимый синтаксис. Возникла проблема с автопривязкой Enviroment к классу Dao, посмотрите, что Дэйв написал здесь , вы можете найти решение по этой ссылке (другой ответ)

person Hezi Schrager    schedule 23.02.2016