java - @Autowired 找不到用 @Repository 标识的存储库 bean

标签 java spring

如果你找不到错误,至少说是或否,我已经执行了所有正确的步骤,这样至少我可以认为我的上下文 xml 文件中存在另一个错误

错误如下

引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到依赖项的 [net.com.htts.transaction.service.mapping.FundService] 类型的匹配 bean:预计至少有 1 个符合 Autowiring 候选资格的 bean对于这种依赖性。依赖注释:{@org.springframework.beans.factory.annotation.Autowired(required=true)}

我有一个 Junit 测试,无法加载存储库 bean。

1)我创建了一个FundRepository接口(interface) 查看纯文本复制到剪贴板打印? 注意:代码块中的文本内容会自动换行 包 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);
} 

该接口(interface)有@Repository

2) 我创建了 FundRepositoryImpl 来实现我的接口(interface)

查看剪贴板打印的纯文本? 注意:代码块中的文本内容会自动换行 包 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);
}
}

创建了 spring 数据上下文

在这种情况下,我添加了以下内容

查看剪贴板打印的纯文本? 注意:代码块中的文本内容会自动换行

           <!-- 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" />

根据我读过的所有内容,这应该足以让我在 FundRepository 中@Autowired。

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>   

最佳答案

据我所知,@Repository 注释必须出现在具体实现上,而不是接口(interface)上。 Spring 不会找到并实例化您的 FundRepositoryImpl,因为它没有标记任何组件注释。一般来说,java中的注释是继承的。某些框架允许通过其他方式进行注释继承。另请参阅this question .

关于java - @Autowired 找不到用 @Repository 标识的存储库 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19299292/

相关文章:

java - Java 中的 MySQL 连接器

java - 使用 Kryo 序列化同步映射

java - Sumit-Multi 交付报告

java - JpaRepository 中的动态实体名称?

java - 从 LinkedList 中删除 "links"?

java - 如何使用 java Spark 为 SPA 实现捕获所有路由

spring - Rest Controller 如何同时处理单个实例应用程序的多个请求?

spring - 使用 Spring SAML -SP 元数据与 IDP 元数据进行 ADFS 集成?

mysql - 使用 spring 框架的 jdbcTemplate 进行复杂的过滤

java - Spring Boot 安全性无法正常工作