扫描另一个包中的存储库
Scan repositories in another package
我正在尝试让我的 Spring 引导应用程序(使用 Spring 数据 REST)发现在另一个包和项目中定义的 Repository
类。我想知道我是否可以配置应用程序来检测 Repository
类 而不必依赖 @EnableJpaRepositories
。
作为背景,我有两个项目。一,暂且称它为data
项目,包含Entity
和Repository
类。另一个,我们称它为 expense-tracker
,是一个 Spring Boot
应用程序,具有 Spring Data REST
作为依赖项,以帮助为 [=18] 中的 Repository
类 生成 REST 端点=] 项目.
这是项目的结构
所有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> {
}
我曾尝试为 @SpringBootApplication
设置 scanBasePackageClasses
(见下文),但没有成功。
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
类?
我认为 Spring 不会看到您的存储库 class 除非您使用 EnableJpaRepositories
但您不必在 SpringBootApplicaiton
class.
您可以将 @ComponentScan(basePackages = {"com.example.data"})
添加到您的 SpringBootApplication
class,然后将以下 class 添加到您的数据项目。
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 {
}
这样可以增加模块化,因为费用跟踪器项目不知道数据项目需要什么样的配置。它将控制权传递给数据项目,让它进行所需的配置。
希望这对您有所帮助。
我正在尝试让我的 Spring 引导应用程序(使用 Spring 数据 REST)发现在另一个包和项目中定义的 Repository
类。我想知道我是否可以配置应用程序来检测 Repository
类 而不必依赖 @EnableJpaRepositories
。
作为背景,我有两个项目。一,暂且称它为data
项目,包含Entity
和Repository
类。另一个,我们称它为 expense-tracker
,是一个 Spring Boot
应用程序,具有 Spring Data REST
作为依赖项,以帮助为 [=18] 中的 Repository
类 生成 REST 端点=] 项目.
这是项目的结构
所有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> {
}
我曾尝试为 @SpringBootApplication
设置 scanBasePackageClasses
(见下文),但没有成功。
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
类?
我认为 Spring 不会看到您的存储库 class 除非您使用 EnableJpaRepositories
但您不必在 SpringBootApplicaiton
class.
您可以将 @ComponentScan(basePackages = {"com.example.data"})
添加到您的 SpringBootApplication
class,然后将以下 class 添加到您的数据项目。
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 {
}
这样可以增加模块化,因为费用跟踪器项目不知道数据项目需要什么样的配置。它将控制权传递给数据项目,让它进行所需的配置。
希望这对您有所帮助。