在另一个包中扫描存储库

问题描述 投票:0回答:1

我正在尝试使用Spring Boot应用程序(使用Spring Data REST)来发现在另一个包和项目中定义的Repository类。我想知道我是否可以配置应用程序来检测Repository类而不必依赖@EnableJpaRepositories

作为背景,我有两个项目。一,我们称之为data项目,包含EntityRepository类。另一个,我们称之为expense-tracker,是一个Spring Boot应用程序,Spring Data REST作为依赖,帮助为Repository项目中的data类生成REST端点。

这是project structure项目的结构

所有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.

我的期望是@SpringBootApplicationscanBasePackageClasses应该允许Spring检测Repository类。是不是这种情况,或者我必须使用另一个注释,类似于EntityScan,告诉Spring Boot在哪里扫描Repository类?

java spring-boot spring-data-rest
1个回答
2
投票

我不认为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 {
}

这样就增加了模块化,因为费用跟踪器项目不知道数据项目需要什么样的配置。它将控件传递给数据项目,以使其执行所需的配置。

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.