[英]Autowired error spring
我是春天的新手。 以前我曾經使用 spring-context xml 配置自動連接。 現在我的項目我們直接使用注解來注入 bean。
當我嘗試自動連接 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]
應該是這樣的:
@Respository
public interface StagingDocumentRepository extends
MongoRepository<CIPPayload, Serializable> {
}
進而 :
@Configuration
@EnableMongoRepositories
public class ThisIsAnAppConfigClass{
@Bean
public StagingDocumentRepository stagingDocumentRepository(){
return new StagingDocumentRepository();
}
}
嘗試在您的 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();
}
}
錯誤信息
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 沒有找到可以注入你的StagingDocumentServiceImpl
StagingDocumentRepository
bean。
您應該確保定義了一個StagingDocumentRepository
bean。 為此,您可以使用多種方法。
StagingDocumentRepository
用掃描注釋(例如@Repository
)。Java配置:
@Bean
public StagingDocumentRepository stagingDocumentRepository() {
return new StagingDocumentRepository(..);
}
你的問題是它返回一個空值。
@Bean
@Qualifier("stagingDocumentRepository")
public StagingDocumentRepository stagingDocumentRepository() {
return new StagingDocumentRepository(..);
}
嘗試使用 @repository 或 @EnableMongoRepositories
您需要了解,在使用 Spring Data 時,指定的存儲庫的實現是由 Spring Data 提供的。 你不應該提供任何這樣的實現。
在您的情況下,如果您已正確配置 Spring Data,則 Spring Data 將提供StagingDocumentRepository
的實現。
Spring 報告不存在類型為StagingDocumentRepository
bean 的StagingDocumentRepository
意味着您沒有正確設置 Spring Data Mongo。
您的 Java 配置如下所示:
@Configuration
@EnableMongoRepositories("package.under.which.repositories.reside")
public class YourConfig {
//whatever beans you need
}
您的倉庫並不需要包含到由Spring數據拾起任何額外的注釋。 它只會是:
public interface StagingDocumentRepository extends
MongoRepository<CIPPayload, Serializable> {
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.