Я пытаюсь заставить свое приложение Spring Boot (с Spring Data REST) обнаруживать классы Repository, определенные в другом пакете и проекте. Интересно, могу ли я настроить приложение для обнаружения классов Repository, не полагаясь на @EnableJpaRepositories.
Для фона у меня есть два проекта. Один, назовем его data проектом, содержит Entity и Repository классы. Другое, назовем его expense-tracker, представляет собой Spring Boot приложение с Spring Data REST в качестве зависимости, помогающее генерировать конечные точки REST для Repository классов в data проекте.
Все Repository классы расширяют PagingAndSortingRepository интерфейс. Один пример ниже.
package com.example.data.repositories;
import com.example.data.entities.Transaction;
import org.springframework.data.repository.PagingAndSortingRepository;
public interface TransactionRepository extends PagingAndSortingRepository<Transaction, Long> {
}
Я пытался установить scanBasePackageClasses вместо @SpringBootApplication (см. ниже), но это не сработало.
package com.example.expensetracker;
import com.example.data.NoOpClass;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
@SpringBootApplication(scanBasePackageClasses = NoOpClass.class)
@EntityScan(basePackageClasses = NoOpClass.class)
public class ExpenseTrackerApplication {
public static void main(String[] args) {
SpringApplication.run(ExpenseTrackerApplication.class, args);
}
}
Сообщение журнала показало, что Spring не обнаружил никаких классов Repository.
2019-04-17 09:33:02.465 INFO 8279 --- [ main] c.e.e.ExpenseTrackerApplication : No active profile set, falling back to default profiles: default
2019-04-17 09:33:09.852 INFO 8279 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-04-17 09:33:10.141 INFO 8279 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 238ms. Found 0 repository interfaces.
Однако, когда я переключился на использование @EnableJpaRepositories (см. ниже), Spring обнаружил классы Repository.
package com.example.expensetracker;
import com.example.data.NoOpClass;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@SpringBootApplication
@EntityScan(basePackageClasses = NoOpClass.class)
@EnableJpaRepositories(basePackageClasses = NoOpClass.class)
public class ExpenseTrackerApplication {
public static void main(String[] args) {
SpringApplication.run(ExpenseTrackerApplication.class, args);
}
}
Сообщение журнала (для приведенного выше случая) указывает, что Spring успешно обнаружил классы Repository.
2019-04-17 09:34:29.921 INFO 8370 --- [ main] c.e.e.ExpenseTrackerApplication : No active profile set, falling back to default profiles: default
2019-04-17 09:34:35.300 INFO 8370 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-04-17 09:34:35.833 INFO 8370 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 483ms. Found 3 repository interfaces.
Я ожидаю, что @SpringBootApplication с scanBasePackageClasses позволит Spring обнаруживать классы Repository. Разве это не так, или мне нужно использовать другую аннотацию, похожую на EntityScan, чтобы указать Spring Boot, где сканировать классы Repository?
@Antoniossss, я не понимаю твоего вопроса.




Я не думаю, что Spring увидит ваш класс репозитория, если вы не используете EnableJpaRepositories, но вам не нужно использовать эту аннотацию в своем классе SpringBootApplicaiton.
Вы можете добавить @ComponentScan(basePackages = {"com.example.data"}) в свой класс SpringBootApplication, а затем следующий класс в свой проект данных.
package com.example.data;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@EnableJpaRepositories
@EnableAutoConfiguration
@Configuration
public class SpringConfiguration {
}
Таким образом вы увеличиваете модульность, потому что проект отслеживания расходов не знает, какая конфигурация нужна проекту данных. Он передает управление проекту данных, чтобы позволить ему выполнить необходимую конфигурацию.
Надеюсь это поможет.
@EnableJpaRepositoryies(classes = {class1,class2}) ?? или сканирование объектов.