2013-10-10 40 views
2

如果您無法發現錯誤,至少說是或否,我已經執行了所有正確的步驟,那麼至少我可以認爲我的另一個錯誤上下文xml文件@Autowired無法找到使用@Repository標識的存儲庫bean

該錯誤是如下

引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:[net.com.htts.transaction.service.mapping.FundService]找不到類型的匹配豆對於依賴關係:預計至少有1個bean有資格作爲此依賴關係的自動導向候選。依賴註釋:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}

我有一個Junit測試,它不能加載存儲庫bean。

1)我創建了一個接口FundRepository view plaincopy to clipboardprint? 注意:代碼塊中的文本內容自動包裝爲文字 package net.com.htts.transaction.data.repository;

import org.springframework.stereotype.Repository; 
import net.com.htts.transaction.data.entity.Fund; 

@Repository 
public interface FundRepository {  
public void createFund(Fund fund); 
} 

package net.com.htts.transaction.data.repository; 

import org.springframework.stereotype.Repository; 
import net.com.htts.transaction.data.entity.Fund; 

@Repository 
public interface FundRepository { 
public void createFund(Fund fund); 
} 

該接口具有@Repository

2)我創建了一個實現我的接口

視圖plaincopy到clipboardprint的FundRepositoryImpl? 注意:代碼塊中的文本內容自動包裝爲文字 package net.com.htts.transaction.data.repository;

import java.util.List; 

import net.com.htts.transaction.data.entity.Fund; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.PersistenceContextType; 

public class FundRepositoryImpl implements FundRepository{ 

@PersistenceContext(type = PersistenceContextType.EXTENDED) 
private EntityManager entityManager; 

public void createFund(Fund fund) { 
    entityManager.persist(fund); 
} 
    } 
    package net.com.htts.transaction.data.repository; 
import java.util.List; 

import net.com.htts.transaction.data.entity.Fund; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.PersistenceContextType; 

public class FundRepositoryImpl implements FundRepository{ 

@PersistenceContext(type = PersistenceContextType.EXTENDED) 
private EntityManager entityManager; 

public void createFund(Fund fund) { 
    entityManager.persist(fund); 
} 
} 

創建彈簧數據上下文

在該上下文中添加以下

視圖plaincopy到clipboardprint

? 注:在代碼塊文本內容自動爲自動換行

  <!-- Scan the repositories --> 
<jpa:repositories base-package="net.com.htts.transaction.data.repository" /> 
      <!-- Scan the data layer --> 
<context:component-scan base-package="net.com.htts.transaction.data" /> 

      <!-- Scan the repositories --> 
<jpa:repositories base-package="net.com.htts.transaction.data.repository" /> 

根據一切我讀這應該足以讓我在@Autowired FundRepository。

JUnit的是如下

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:/spring/fund-test-data.xml") 
public class FundRepositoryTest { 

@Autowired  
private FundRepository repository; 



@Test 
public void createFund(){ 
} 

}

上下文是如下

<bean id="entityManagerFactory" 
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan"> 
     <list> 
      <value>net.com.htts.transaction.data</value> 
      <value>net.com.htts.transaction.data.repository</value> 
     </list> 
    </property> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="true" /> 
      <property name="databasePlatform" value="org.hibernate.dialect.MySQLInnoDBDialect" /> 
      <property name="generateDdl" value="true" /> 
     </bean> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">validate</prop> 
      <prop key="hibernate.ejb.naming_strategy"> 
     net.com.htts.transaction.data.naming.NamingStrategy</prop> 
     </props> 
    </property> 
</bean> 

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost/funds" /> 
    <property name="username" value="fund_user" /> 
    <property name="password" value="fund_user" /> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

<!-- Scan the data layer --> 
<context:component-scan base-package="net.com.htts.transaction.data" /> 

<!-- Scan the repositories --> 
<jpa:repositories base-package="net.com.htts.transaction.data.repository" /> 

</beans> 

回答

3

AFAIK的@Repository註釋必須存在於具體的實現,而不是接口。 Spring不會找到並實例化您的FundRepositoryImpl,因爲它沒有標記任何組件註釋。一般來說,java中的註釋是而不是繼承。有些框架允許通過其他方式進行註釋繼承。另見this question

0

註釋做沒有繼承,你應該在實現接口的類中使用註解。 如果你要實現,則必須使用@Qualifire

0

1)從你的日誌片斷No matching bean of type [net.com.htts.transaction.service.mapping.FundService]表明該問題是否與FundService某處項目的定義,我沒有看到所呈現的來源任何地方。你確實具有回購問題

仔細檢查,並附加相應的日誌,或者看看該服務

2)如果你想簡化你的代碼,並避免重寫一次數據訪問層,您可以利用spring data repositories

相關問題