Пружина ошибки Autowired

Я новичок в весне. Ранее я использовал для настройки автоматической проводки использование spring-context xml. Теперь в моем проекте мы используем аннотацию напрямую для внедрения компонента.

Я получаю следующее исключение, когда пытаюсь автоматически подключить репозиторий Mongo.

Ниже приведен пример кода.

StagingDocumentServiceImpl:

@Service
public class StagingDocumentServiceImpl implements StagingDocumentService {

private static final Logger logger = Logger.getLogger(StagingDocumentServiceImpl.class);
@Autowired
private StagingDocumentRepository stagingDocumentRepository;

/**
 * 
 */
@Override
@Transactional(readOnly = false)
public List<String> saveRawData(Tuple twitter) {

    List<String> tweetIDs = new ArrayList<String>();
    System.out.println("Twitter information get passed.." + twitter);
    Status tweets = (Status) twitter
            .getValueByField(TopologyConstants.TWEETSPOUT_OUT_FIELD);
    //try{
    CIPPayload twitterPayload = DataCaptureTwitterUtil
            .getrawJSONPayloadFromTwitterResponse(tweets);
    String parentID = null;
    System.out.println("twitterPayload"+twitterPayload);
    String tweetParentId = twitterPayload.getContent().getParentContentId();
    /*if (StringUtils.isNotBlank(tweetParentId)) {
        DBObject queryObject = new BasicDBObject();
        queryObject.put("content.id", tweetParentId);
        DBObject resultedData = stagingDocumentRepository.fi
        if (resultedData == null) {
            parentID = getOriginalTweet(tweetParentId);
            tweetIDs.add(parentID);
        }

    }*/

    Test test = stagingDocumentRepository.save(twitterPayload);

    System.out.println("test-->"+test);


    return tweetIDs;
}

Промежуточный репозиторий документов:

 public interface StagingDocumentRepository extends
  MongoRepository<CIPPayload, Serializable> {

 }

Проблема в том, что я знаю, как настроить аннотацию @bean.

Я попытался настроить, как показано ниже.

После всего нижеприведенного ответа я изменил конфигурацию, как показано ниже.

Но изменить это тоже не получится.

@Configuration
public class AppConfig {
    @Bean
    @Bean
    public StagingDocumentRepository stagingDocumentRepository(){
        return new StagingDocumentRepository() {

            @Override
            public <S extends CIPPayload> S save(S entity) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public CIPPayload findOne(Serializable id) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public Iterable<CIPPayload> findAll(Iterable<Serializable> ids) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public boolean exists(Serializable id) {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public void deleteAll() {
                // TODO Auto-generated method stub

            }

            @Override
            public void delete(Iterable<? extends CIPPayload> entities) {
                // TODO Auto-generated method stub

            }

            @Override
            public void delete(CIPPayload entity) {
                // TODO Auto-generated method stub

            }

            @Override
            public void delete(Serializable id) {
                // TODO Auto-generated method stub

            }

            @Override
            public long count() {
                // TODO Auto-generated method stub
                return 0;
            }

            @Override
            public Page<CIPPayload> findAll(Pageable pageable) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public <S extends CIPPayload> List<S> save(Iterable<S> entites) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public List<CIPPayload> findAll(Sort sort) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public List<CIPPayload> findAll() {
                // TODO Auto-generated method stub
                return null;
            }
        };
}

Вывод:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stagingDocumentServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.biomorf.cip.datacapture.repository.payload.StagingDocumentRepository com.biomorf.cip.datacapture.processing.serviceImpl.StagingDocumentServiceImpl.stagingDocumentRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.biomorf.cip.datacapture.repository.payload.StagingDocumentRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) ~[spring-context-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) ~[spring-context-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) [spring-boot-1.1.4.RELEASE.jar:1.1.4.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) [spring-boot-1.1.4.RELEASE.jar:1.1.4.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:952) [spring-boot-1.1.4.RELEASE.jar:1.1.4.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:941) [spring-boot-1.1.4.RELEASE.jar:1.1.4.RELEASE]
    at com.biomorf.cip.datacapture.Application.main(Application.java:32) [classes/:na]
       Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.biomorf.cip.datacapture.repository.payload.StagingDocumentRepository com.biomorf.cip.datacapture.processing.serviceImpl.StagingDocumentServiceImpl.stagingDocumentRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.biomorf.cip.datacapture.repository.payload.StagingDocumentRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    ... 15 common frames omitted
       Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.biomorf.cip.datacapture.repository.payload.StagingDocumentRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1103) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) ~[spring-beans-4.0.6.RELEASE.jar:4.0.6.RELEASE]

person bharathi    schedule 11.08.2014    source источник
comment
Вы объявили StagingDocumentRepository в файле конфигурации bean-компонента?   -  person AlexGreg    schedule 11.08.2014
comment
Нет. Я знаю, как это сделать. Раньше я делал в файле spring-context. Я знаю, как вводить с помощью аннотации @Bean.   -  person bharathi    schedule 11.08.2014
comment
Попробуйте поместить это в свой @Bean, @Qualifier(stagingDocumentRepository)   -  person Xstian    schedule 11.08.2014
comment
Это то, что я настроил @Bean @Qualifier(stagingDocumentRepository) public StagingDocumentRepository stagingDocumentRepository(){ }   -  person bharathi    schedule 11.08.2014
comment
Решение проблемы Эта ошибка результаты в основном за счет структурирования папок   -  person Nathaniel Cobbinah    schedule 27.12.2020


Ответы (6)


должно быть так:

@Respository
public interface StagingDocumentRepository extends
MongoRepository<CIPPayload, Serializable> {

}

а потом :

@Configuration
@EnableMongoRepositories
public class ThisIsAnAppConfigClass{

   @Bean 
   public StagingDocumentRepository stagingDocumentRepository(){
      return new StagingDocumentRepository();
   }

}
person Arno_Geismar    schedule 11.08.2014

Сообщение об ошибке

No qualifying bean of type [com.biomorf.cip.datacapture.repository.payload.StagingDocumentRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.

сообщает вам, что Spring не нашел StagingDocumentRepository bean-компонента, который можно было бы внедрить в ваш StagingDocumentServiceImpl.

Вы должны убедиться, что вы определили bean-компонент StagingDocumentRepository. Для этого можно использовать различные способы.

  • используйте конфигурацию xml, как Arno_Geismar показал в своем ответе
  • используйте функцию сканирования компонентов и аннотируйте StagingDocumentRepository отсканированной аннотацией (например, @Repository).
  • используйте конфигурацию Java для определения компонента (как показано ниже)

Конфигурация Java:

@Bean
public StagingDocumentRepository stagingDocumentRepository() {
  return new StagingDocumentRepository(..);
}
person micha    schedule 11.08.2014

попробуйте определить это в файле spring config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">

<bean class="path.to.your.stagingdocumentrepository" id="StagingDocumentRepository" />

</beans>

эквивалент без xml выглядит так:

@Configuration
public class ThisIsAnAppConfigClass{

   @Bean 
   public StagingDocumentRepository stagingDocumentRepository(){
      return new StagingDocumentRepository();
   }
}
person Arno_Geismar    schedule 11.08.2014
comment
@Arno_Gesmar Я отредактировал свою конфигурацию в соответствии с вашим предложением. но все же получаю то же исключение. - person bharathi; 11.08.2014
comment
Аннотируйте свой репозиторий StagingDocumentRepository с помощью @Repository - person Arno_Geismar; 11.08.2014
comment
@Arno_Gesmar Извините, что беспокою вас каждый раз. Я также добавил репозиторий, но результат тот же - person bharathi; 11.08.2014
comment
@Arno_Gesmar после изменений, которые я получаю Не удается создать экземпляр типа StagingDocumentRepository в классе ThisIsAnAppConfigClass. Я думаю, что мне нужно переопределить методы репозитория mongo - person bharathi; 11.08.2014
comment
У вас должен быть конкретный класс, реализующий интерфейс. Затем ваш метод: public StagingDocumentRepository stagingDocumentRepository(){ return new StagingDocumentRepositoryImpl(); } должен вернуть реализацию - person Arno_Geismar; 11.08.2014
comment
мой последний комментарий решил вашу проблему? С уважением, Арно - person Arno_Geismar; 11.08.2014
comment
@Arno_Gesmar извините за поздний ответ. дай мне немного времени. Я вернусь к тебе. Спасибо. - person bharathi; 11.08.2014

Ваша проблема в том, что он возвращает нулевое значение.

@Bean
@Qualifier("stagingDocumentRepository")
public StagingDocumentRepository stagingDocumentRepository() {
  return new StagingDocumentRepository(..);
}
person Xstian    schedule 11.08.2014

Попробуйте использовать @repository или @EnableMongoRepositories

person Sujata    schedule 11.08.2014

Вы должны понимать, что при использовании Spring Data реализация указанного репозитория обеспечивается Spring Data. Вы не должны не предоставлять такую ​​реализацию.

В вашем случае реализация StagingDocumentRepository будет предоставлена ​​Spring Data, если вы правильно настроили Spring Data.

Тот факт, что Spring сообщает, что bean-компонент типа StagingDocumentRepository не существует, означает, что вы неправильно настроили Spring Data Mongo.

Ваша конфигурация Java будет выглядеть так:

@Configuration
@EnableMongoRepositories("package.under.which.repositories.reside")
public class YourConfig {

    //whatever beans you need
}

Ваш репозиторий не должен содержать какие-либо дополнительные аннотации, которые будут приняты Spring Data. Было бы просто:

public interface StagingDocumentRepository extends
  MongoRepository<CIPPayload, Serializable> {

}
person geoand    schedule 11.08.2014