2016-03-10 2 views
1

У меня есть веб-приложение Spring. Веб-приложение, которое я показал ниже, не требуется. Поэтому я упомянул условие не загружать веб-приложение. Также я не просматриваю пакет, в котором этот компонент определен в моей ApplicationConfig.java. Но я все еще получаю исключениеВесна ожидает все бобы при запуске веб-приложения?

Could not autowire field: private com.Foo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.Foo] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. 

@Bean 
@ConditionalOnNotWebApplication 
@ConditionalOnProperty(name=LNACALL, havingValue = "true") 
public Foo createFoo() { 
    return new Foo(); 
} 
+1

Кажется, что «Foo» вводится другому бонусу. Но, согласно условию, Spring не загружал 'Foo', и поэтому не смог найти его для инъекций. –

+0

Да Foo автоувеличивается в разных компонентах. Но этот компонент также не сканируется. – Deepak

ответ

2

Похоже, что вы могли бы иметь @Autowired аннотации где-то в вашем приложении, ожидающим боб этого типа. Вы можете попробовать сделать одно из следующих действий:

  • @Autowired (требуется = ложь) с инъекцией поле, чтобы указать, что это не является обязательным

    @Autowired(required=false) private Foo foo; 
    
  • Использование сеттер инъекции вместо, поместив @Autowired на сеттер:

    @Autowired(required=false) 
    public void setFoo(Foo foo) { 
        this.foo = foo; 
    } 
    

Резюмируя, инъекции зависимостей конструктор на основе (@Autowired на т конструктор) для обязательных зависимостей. Обязательный флаг в @Autowired будет проигнорирован, и компонент должен присутствовать.

Установка на основе сетки и вставка поля могут использоваться для дополнительных зависимостей, если установленный флаг @Autowired установлен в значение false. Если для установленного флага установлено значение false, Spring добавит компонент, если он присутствует. Если его нет, то значение будет равно нулю.

+0

Да, у меня есть автофокусированный Foo в разных компонентах. Но класс, в котором я выполняю автоопределение Foo, не сканируется в моем сканировании компонентов ... но все же он ожидает bean-компонента. Весна ожидает, что все автообученные бобы будут независимо от сканирования? – Deepak

+0

Нет, если ваш другой компонент не сканируется, то Spring не будет требовать наличия Foo. Если вы попытаетесь удалить эту @Autowired аннотацию в другом классе, вы все еще получаете проблему? Возможно, вы используете Spring Boot, который в зависимости от того, как он настроен, автоматически добавит ваши сканируемые пакеты? Может быть, что-то еще добавляет ваши пакеты для сканирования или вы возвращаете этот класс как @Bean? Обратите внимание, что подпакеты также сканируются для пакетов, указанных для сканирования. –

+0

Не могли бы вы рассказать о том, как мне дать @Autowired (required = false). Если у меня есть класс, где «class Boo {Autowired (required = false) Foo foo;" Весна не будет Autowire bean, если она недоступна, и это не будет ошибкой trriow? Правильно ли я понимаю? И будет ли он доступен, если bean доступен? – Deepak