如果你发现错误至少说是或否我已经执行了所有正确的步骤,那么至少我可以认为我的上下文xml文件中有另一个错误
错误如下
由以下原因引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型为[net.com.htts.transaction.service.mapping.FundService]的匹配bean依赖:预期至少有1个bean有资格作为autowire候选者对于这种依赖。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}
我有一个不能加载存储库bean的Junit测试。
1)我创建了一个接口FundRepository 查看plaincopy到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)我创建了FundRepositoryImpl,它实现了我的界面
查看plaincopy到clipboardprint? 注意:代码块中的文本内容自动换行 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" />
根据我所读到的一切,这应该足以让我在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>
答案 0 :(得分:3)
Afaik @Repository
注释必须出现在具体实现上,而不是接口上。 Spring不会找到并实例化您的FundRepositoryImpl
,因为它没有标记任何组件注释。通常,java中的注释是不继承的。一些框架允许通过其他方式进行注释继承。另请参阅this question。
答案 1 :(得分:0)
注释不继承,您应该在实现接口的类中使用注释。 如果必须实施,则必须使用 @Qualifire
答案 2 :(得分:0)
1)从您的日志片段No matching bean of type [net.com.htts.transaction.service.mapping.FundService]
表示问题出在项目某处的FundService定义中,我在所提供的来源中没有看到任何内容。
仔细检查您确实遇到了回购并附上相应的日志,或者查看该服务
2)如果您想简化代码并避免再次重写数据访问层,您可以利用spring data repositories