2017-03-18 137 views
0

的同事,我'尝试使用Spring库界面污物从数据库获取数据:如何修复从Spring Data Jpa使用CrudRepository时的NoSuchBeanDefinitionException?

@Component 
public interface AssetsGapSortDAO extends CrudRepository<AssetsGapSortEntity, Integer> { 
    AssetsGapSortEntity getByIsin(String ISIN); 
} 

JPA实体的样子:

@Entity 
@Table(name = "Assets", schema = "dbo", catalog = "") 
public class AssetsGapSortEntity { 
    private BigInteger id; 

    private String shortName; 
    private String isin; 
    private int registrationDate; 
    /*Some other properties*/ 

    @Basic 
    @Column(name = "id") 
    public BigInteger getId() { 
     return id; 
    } 

    public void setId(BigInteger id) { 
     this.id = id; 
    } 


    @Id 
    @Column(name = "ShortName") 
    public String getShortName() { 
     return shortName; 
    } 

    public void setShortName(String shortName) { 
     this.shortName = shortName; 
    } 


    @Basic 
    @Column(name = "ISIN") 
    public String getIsin() { 
     return isin; 
    } 

    public void setIsin(String isin) { 
     this.isin = isin; 
    } 

    /*Equals and hashcode methods*/ 


    @Override 
    public String toString() { 
     ToStringStyle style = new NotNullToStringStyle(); 
     return ToStringBuilder.reflectionToString(this, style); 
    } 


} 

当我运行JUnit测试:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = OlmeSmbConfig.class, loader = AnnotationConfigContextLoader.class) 
public class AssetsGapSortDAOTest { 
    private static final Logger log = LoggerFactory.getLogger(ExtractionsDAOTest.class); 

    @Autowired 
    AssetsGapSortDAO assetsGapSortDAO; 

    @Test 
    public void getByIsin() throws Exception { 
     log.info(assetsGapSortDAO.getByIsin("TT0W3888254").toString()); 
    } 

} 

我收到naxt stackTrace:

java.lang.IllegalStateException: Failed to load ApplicationContext 

    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) 
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83) 
.... 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'assetInfoLoader': Unsatisfied dependency expressed through field 'assetsGapSortDAO'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.comp.olme.jpa.dao.GapSort.AssetsGapSortDAO' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
    .... 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) 
    ... 29 more 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.comp.olme.jpa.dao.GapSort.AssetsGapSortDAO' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1474) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1102) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1064) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) 
    ... 45 more 

我的配置是这样的:

@Configuration 
@EnableTransactionManagement 
@ComponentScan (basePackages = {"com.comp.olme"}) 
@PropertySource("classpath:OlmeSmb-${env}.properties") 
@EnableScheduling 
public class OlmeSmbConfig { 
/*There are DataSource, EntityManagerFactory beans etc....*/ 
} 

当我用简单的JPA一切工作正常,但我想尝试CrudRepository。 所以问题是为什么我收到NoSuchBeanDefinitionException以及如何解决它? 谢谢。

UPDATE

根据@javaguy建议我加入到我的配置@EnableJpaRepositories注释:

@EnableJpaRepositories(basePackages="com.comp.olme", entityManagerFactoryRef ="emGapSort", transactionManagerRef = "txManagerGapSort") 

和 “NoSuchBeanDefinitionException” 是固定的,但新的提高:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name '(inner bean)#3e4e8fdf': Unsatisfied dependency expressed through method 'createSharedEntityManager' parameter 0: 
Could not convert argument value of type [com.sun.proxy.$Proxy44] to required type [javax.persistence.EntityManagerFactory]: 
Failed to convert value of type 'com.sun.proxy.$Proxy44 implementing org.hibernate.jpa.HibernateEntityManager,org.springframework.orm.jpa.EntityManagerProxy' to required type 'javax.persistence.EntityManagerFactory'; 
nested exception is java.lang.IllegalStateException: 
Cannot convert value of type 'com.sun.proxy.$Proxy44 implementing org.hibernate.jpa.HibernateEntityManager,org.springframework.orm.jpa.EntityManagerProxy' to required type 'javax.persistence.EntityManagerFactory': 
no matching editors or conversion strategy found 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:723) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:467) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1134) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1028) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:299) 
    ... 58 more 

可能是因为我在Spring Config中有多个数据源(有两个用于diffe租DB)?如何解决它? 很抱歉,如果它的范围...

+0

为什么用'@ Component'注释'AssetsGapSortDAO'?我不认为这是必要的 – Pons

回答

2

spring-data自动提供实现你的DAO(库)班(即,为您AssetsGapSortDAO接口),但你需要告诉您的仓库类都可以找到。因此,请将@EnableJpaRepositories(basePackages="com.yourproject")级别注释添加到您的OlmeSmbConfig类中以扫描存储库。

我建议你参考here了解春季数据的工作原理。

另外,我建议你来注释AssetsGapSortDAO作为@Repository而非@Component(即使在技术上它工作,标志着@Repository使得对存储库/ DAO类更清晰)。

+0

javaguy,谢谢。 – May12

相关问题