我正在尝试让我的Spring Boot应用程序(带有Spring Data REST)发现另一个软件包和项目中定义的Repository
类。我想知道是否可以将应用程序配置为检测Repository
类而不必依赖@EnableJpaRepositories
。
作为背景,我有两个项目。我们将其称为data
项目,其中包含Entity
和Repository
类。另一个我们称为expense-tracker
的是一个Spring Boot
应用程序,它以Spring Data REST
作为依赖项,以帮助为Repository
项目中的data
类生成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> {
}
我尝试将scanBasePackageClasses
的{{1}}设置为@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
类?
答案 0 :(得分:1)
除非您使用EnableJpaRepositories
,否则我认为Spring不会看到您的存储库类,但是您不必在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 {
}
这样,您可以提高模块化,因为费用跟踪程序项目不知道数据项目需要哪种配置。它将控制权传递给数据项目,以使其进行所需的配置。
希望这会有所帮助。