Пружинные профили: репозиторий 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.

Другие вопросы по тегам