Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Sprint数据使用多个数据模块在运行时注入具有不同实现的相同接口_Java_Spring_Jpa_Jdbc - Fatal编程技术网

Java Sprint数据使用多个数据模块在运行时注入具有不同实现的相同接口

Java Sprint数据使用多个数据模块在运行时注入具有不同实现的相同接口,java,spring,jpa,jdbc,Java,Spring,Jpa,Jdbc,我试图在一个项目上实现多个Spring数据模块,并选择在运行时使用哪种类型的数据模块(JPA或JDBC) 经过几次尝试,我实现了以下目标: 两个配置类,每个配置类具有不同的启用存储库(一个具有EnableJdbcRepositories,另一个具有EnableJpaRepositories) 我希望在控制器上使用此接口作为存储库 在application.properties上,我有spring.profiles.active=jdbc 但当我运行应用程序时,日志显示 The follo

我试图在一个项目上实现多个Spring数据模块,并选择在运行时使用哪种类型的数据模块(JPA或JDBC)

经过几次尝试,我实现了以下目标:

  • 两个配置类,每个配置类具有不同的启用存储库(一个具有EnableJdbcRepositories,另一个具有EnableJpaRepositories)
  • 我希望在控制器上使用此接口作为存储库
在application.properties上,我有spring.profiles.active=jdbc

但当我运行应用程序时,日志显示

The following profiles are active: jdbc
这就是它应该做的,所以没关系,但是:

Multiple Spring Data modules found, entering strict repository configuration mode!

然后Spring尝试查找Jdbc和Jpa的实体,并假定Jpa为默认值。我能做什么呢?

在这件事上浪费了这么多时间,而且很容易。。 使用配置您的application.properties

spring.data.jpa.repositories.enabled=false
spring.data.jdbc.repositories.enabled=true
完成了!现在它将返回一个JPA或JDBC实例。您甚至不需要有单独的接口来扩展一个公共接口,只需创建一个扩展crudepository即可

编辑:另一种方法

不在application.properties上使用该标志,只使用spring.profiles.active=jdbc(例如) 删除我的配置类并为每个接口放置@Profile(如我的示例,ExampleJdbcInterface将具有@Profile(“jdbc”),ExampleJpaInterface将具有@Profile(“jpa”)。现在将enablerepositories添加到主类中,这意味着它将类似于:

@SpringBootApplication
@EnableJdbcRepositories(basePackages="com.example.repository.repository.jdbc")
@EnableJpaRepositories(basePackages="com.example.repository.repository.jpa")
public class ExampleApplication {
现在Spring将只查找具有正确配置文件的接口(很可能我的示例不起作用,因为我只在配置中有配置文件,所以他尝试查找所有存储库,这样做将解决问题,因为他只“查找”仅用于一个实例。此外,还需要enablerepositories,因为否则他将尝试默认为JPA,即使只有包jdbc的接口被@Profile激活)


这个解决方案有一个优点:假设我们想为我们的存储库添加一个方法。这样,我们可以在每种技术上创建一个自定义接口和相应的实现,然后每个接口将扩展该方法的自定义实现。

您的
@Bean
方法是完全冗余的;如果它们可以
>@自动连线
,它们已经就位。很可能您遇到的是Spring Boot(?)在默认情况下打开了这些存储库。很可能。但是,如果是这样,我如何告诉Spring Boot“不要加载所有数据模块,只需使用JPA即可”(例如)。因为最大的问题是,他正在分析JPA和JDBC的存储库和实体,然后决定默认使用JPA,因为我在JPA和JDBC上使用相同的类作为实体。除非我为每个实现指定不同的类实体,否则Spring将使用JPA。(1/2)我测试了autowire 2存储库接口,一个用于JPA,扩展了JpaRepository,另一个用于Jdbc,扩展了Crudepository。因为我使用同一个类作为两者的实体,所以在这两个实例中,我可以在调试器上看到他正在实例化SimpleParepository。只有当我用其他类实体声明Jdbc时,Spring返回一个SimpleJDBCResposition。(2/2)您现在甚至不需要应用程序中的任何配置文件位;您可以在
application.properties
中为这两个设置
enabled=false
,然后使用
true
创建一个
应用程序jdbc.properties
    @RestController
    public class ExampleController {
    
        @Autowired
        private ExampleInterface repo;
    
    
        public ExampleController(){
    
        }
    }
The following profiles are active: jdbc
Multiple Spring Data modules found, entering strict repository configuration mode!
spring.data.jpa.repositories.enabled=false
spring.data.jdbc.repositories.enabled=true
@SpringBootApplication
@EnableJdbcRepositories(basePackages="com.example.repository.repository.jdbc")
@EnableJpaRepositories(basePackages="com.example.repository.repository.jpa")
public class ExampleApplication {