Сканировать репозитории в другом пакете

Я пытаюсь заставить свое приложение 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?

@EnableJpaRepositoryies(classes = {class1,class2}) ?? или сканирование объектов.

Antoniossss 17.04.2019 15:44

@Antoniossss, я не понимаю твоего вопроса.

Phuong Hoang 17.04.2019 15:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
2 555
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не думаю, что 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 {
}

Таким образом вы увеличиваете модульность, потому что проект отслеживания расходов не знает, какая конфигурация нужна проекту данных. Он передает управление проекту данных, чтобы позволить ему выполнить необходимую конфигурацию.

Надеюсь это поможет.

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