Пружинные профили: репозиторий bean не может быть подключен автоматически
У меня возникают проблемы при попытке запустить тест JUnit с созданным профилем Spring. На самом деле, профили работают нормально, за исключением бина репозитория, который не может быть подключен автоматически.
Это фрагмент кода, который я использую для настройки персистентности в spring-gration-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>
Поэтому я подумал, что этого будет достаточно, обернув всю конфигурацию персистентности элементом "bean profile".
Теперь из моего тестового класса JUnit:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ApplicationTest.class)
@ActiveProfiles("dev")
public class ScheduleLoaderTests {
@Autowired
ScheduleLoader schedLoader;
@Autowired
ScheduleRepository shedRep;
@Test
public void someTest() { ... }
}
А затем я аннотирую свой класс ApplicationTest с помощью:
@ImportResource ("Путь к классам:/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)}
Обратите внимание, что в моем тестовом классе ScheduleLoader ранее был автоматически подключен, действительно, этот компонент также находится в профиле разработчика. Если я пытаюсь запустить тест без аннотации @ActiveProfiles("dev"), то исключение выдается из-за сбоя автопроводки ScheduleLoader, как и ожидалось (так как это только в профиле dev).
Так в чем же проблема с пружинными профилями и моей конфигурацией устойчивости?
PD: я убедился, что мой репозиторий и класс сущности находятся в пределах этого
guiatv.persistence.*
пакет.
Кстати, я использую Spring Boot, поэтому я также попытался заставить его работать, добавив spring.profiles.active=dev в мой файл application.properties вместо записи аннотации @ActiveProfiles("dev").
ОБНОВИТЬ
Кроме того, если я попытаюсь удалить все элементы "Beans Profile", чтобы каждый компонент был дочерним элементом корневого элемента "Beans", все работает нормально, без аннотации @ActiveProfiles("dev") или с @ActiveProfiles ("по умолчанию") аннотация.
1 ответ
Теперь это работает.
@dunni, что вы видите, это вся конфигурация, связанная с постоянством. И да, я использую JPA, но, как я уже сказал, я использую Spring Boot. Похоже, Spring Boot настраивает persistence.xml для вас (и я думаю, это то, о чем вы спрашивали).
Итак, единственное, чего не хватало, это @SpringBootApplication в моем классе ApplicationTest, чтобы сделать автоконфигурирование репозиториев Spring Boot.
И извините за мое запутанное ОБНОВЛЕНИЕ, где я тоже пропускал @SpringBootApplication.