Spring 配置文件:无法自动装配存储库 bean
Spring profiles: Repository bean cannot be autowired
我在尝试使用我创建的 Spring 配置文件 运行 JUnit 测试时遇到问题。实际上,配置文件确实可以正常工作,除了无法自动装配的存储库 bean。
这是我用来在 spring-integration-context.xml:
中配置持久性的代码片段
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
.... Some namespaces definitions
<beans profile="dev">
<jdbc:embedded-database id="dataSource" type="H2" />
<!-- Define the JPA transaction manager -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<constructor-arg ref="entityManagerFactory" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="vendorAdaptor" />
<property name="packagesToScan" value="guiatv.persistence.*" />
</bean>
<bean id="abstractVendorAdaptor" abstract="true">
<property name="generateDdl" value="true" />
<property name="database" value="H2" />
<property name="showSql" value="false" />
</bean>
<bean id="entityManager"
class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="vendorAdaptor"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
parent="abstractVendorAdaptor">
</bean>
</beans>
... Some other beans, some of them with the same "dev" profile
</beans>
所以我认为用 "beans profile" 元素包装整个持久性配置就足够了。
现在,根据我的 JUnit 测试 class:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ApplicationTest.class)
@ActiveProfiles("dev")
public class ScheduleLoaderTests {
@Autowired
ScheduleLoader schedLoader;
@Autowired
ScheduleRepository shedRep;
@Test
public void someTest() { ... }
}
然后我用以下内容注释我的 ApplicationTest class:
@ImportResource("classpath:/META-INF/spring/integration/spring-integration-context.xml")
但是当我运行测试时,我得到以下异常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [guiatv.persistence.repository.ScheduleRepository] 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)}
请注意,在我的测试中 class,ScheduleLoader 之前是自动装配的,事实上,bean 也在开发配置文件中。如果我尝试 运行 测试而不
@ActiveProfiles("dev") 注释,然后 ScheduleLoader 自动装配失败 抛出异常(因为它仅在开发配置文件中) ).
那么 spring 配置文件和我的持久性配置有什么问题?
PD:我已确保我的存储库和实体 class 在
中
guiatv.persistence.*
包。
顺便说一句,我使用的是 Spring Boot,所以我也尝试通过在我的 spring.profiles.active=dev =61=] 文件而不是写入
@ActiveProfiles("dev") 注释.
更新
此外,如果我尝试删除每个 "beans profile" 元素,以便每个组件都是根 "beans" 元素的子元素,则一切正常,或者没有 @ActiveProfiles("dev") 注释或带有@ActiveProfiles("default") 注释。
现在可以使用了。
@dunni 你看到的是整个持久化相关的配置。是的,我使用 JPA,但正如我所说,我使用的是 Spring Boot。似乎 Spring 启动为您配置了 persistence.xml(我猜这就是您要问的)。
因此,唯一缺少的是我的 ApplicationTest class 上的 @SpringBootApplication,以便让存储库由 Spring启动。
很抱歉我的更新令人困惑,我也错过了 @SpringBootApplication。
我在尝试使用我创建的 Spring 配置文件 运行 JUnit 测试时遇到问题。实际上,配置文件确实可以正常工作,除了无法自动装配的存储库 bean。
这是我用来在 spring-integration-context.xml:
中配置持久性的代码片段<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
.... Some namespaces definitions
<beans profile="dev">
<jdbc:embedded-database id="dataSource" type="H2" />
<!-- Define the JPA transaction manager -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<constructor-arg ref="entityManagerFactory" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="vendorAdaptor" />
<property name="packagesToScan" value="guiatv.persistence.*" />
</bean>
<bean id="abstractVendorAdaptor" abstract="true">
<property name="generateDdl" value="true" />
<property name="database" value="H2" />
<property name="showSql" value="false" />
</bean>
<bean id="entityManager"
class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="vendorAdaptor"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
parent="abstractVendorAdaptor">
</bean>
</beans>
... Some other beans, some of them with the same "dev" profile
</beans>
所以我认为用 "beans profile" 元素包装整个持久性配置就足够了。
现在,根据我的 JUnit 测试 class:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ApplicationTest.class)
@ActiveProfiles("dev")
public class ScheduleLoaderTests {
@Autowired
ScheduleLoader schedLoader;
@Autowired
ScheduleRepository shedRep;
@Test
public void someTest() { ... }
}
然后我用以下内容注释我的 ApplicationTest class:
@ImportResource("classpath:/META-INF/spring/integration/spring-integration-context.xml")
但是当我运行测试时,我得到以下异常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [guiatv.persistence.repository.ScheduleRepository] 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)}
请注意,在我的测试中 class,ScheduleLoader 之前是自动装配的,事实上,bean 也在开发配置文件中。如果我尝试 运行 测试而不 @ActiveProfiles("dev") 注释,然后 ScheduleLoader 自动装配失败 抛出异常(因为它仅在开发配置文件中) ).
那么 spring 配置文件和我的持久性配置有什么问题?
PD:我已确保我的存储库和实体 class 在
中guiatv.persistence.*
包。
顺便说一句,我使用的是 Spring Boot,所以我也尝试通过在我的 spring.profiles.active=dev =61=] 文件而不是写入 @ActiveProfiles("dev") 注释.
更新
此外,如果我尝试删除每个 "beans profile" 元素,以便每个组件都是根 "beans" 元素的子元素,则一切正常,或者没有 @ActiveProfiles("dev") 注释或带有@ActiveProfiles("default") 注释。
现在可以使用了。
@dunni 你看到的是整个持久化相关的配置。是的,我使用 JPA,但正如我所说,我使用的是 Spring Boot。似乎 Spring 启动为您配置了 persistence.xml(我猜这就是您要问的)。
因此,唯一缺少的是我的 ApplicationTest class 上的 @SpringBootApplication,以便让存储库由 Spring启动。
很抱歉我的更新令人困惑,我也错过了 @SpringBootApplication。