前言
在日常工作中使用Spring Boot是已经搭建好了的框架。但在自己从头开始的过程中难免会碰到一些问题,解决这些问题可以让我们更好地了解Spring Boot。
问题描述
main
com.hill
+- app
| +- Application.java
+- entity
| +- PersonEntity.java
+- repository
+- PersonRepository.java
test
com.hill
+- repository
+- PersonRepositoryTest.java
在使用 @DataJpaTest 结合Spring Boot编写测用例时在PersonRepositoryTest.java中提示依赖未注入,但在Repository类上已经通过注解标明这是一个bean对象。
搜索相关异常的过程中慢慢发现这是由于自己的项目结构和Spring Boot约定规范不一致导致的。如果在这上述的目录结构下想要运行单元测试,需要额外添加
@EnableJpaRepositories(basePackages = "com.hill")
@EntityScan(basePackages = "com.hill")
两个注解在启动类上,这样Spring Boot才能正确地扫描到需要的@Entity和@Repository注解。
然而仅仅通过微调一下目录的结构,就可以很轻松地解决这个问题
最佳实践
com
+- example
+- myapplication
+- Application.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
上面的目录结构是Spring Boot官方文档中的例子,其中Spring Boot启动类位于customer,order包的上方,并标注了 @SpringBootApplication 注解。
Spring官方建议将启动类放置在根路径下,因为当启动类被标注了@SpringBootApplication后,Spring Boot会自动扫描该类所在的包及其子包,寻找定义的各类Bean。相当于隐式指定了basePackages属性。
所以在上面的测试用例中,只需要将启动类放置在com.hill包下即如下的目录结构,便可以正常地执行测试用例。
main
com.hill
+- Application.java
+- entity
| +- PersonEntity.java
+- repository
+- PersonRepository.java
对比看来无疑这种方法更为优雅。