首页 > 解决方案 > 从 Spring Boot 写入 2 个数据库的问题

问题描述

我正在从 github 尝试此代码:https
://github.com/kodinor/spring-data-many-dbs 这是如何从 Spring-boot 应用程序使用多个 db 的示例。它工作正常,但我添加了 Spring-boot-starter-web 依赖项,现在出现错误:

>Method requestMappingHandlerMapping in >org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$En>ableWebMvcConfiguration required a single bean, but 2 were found:
>   - productDSEmFactory: defined by method 'productDSEmFactory' in class >path resource [com/kodinor/configuration/ProductDBConfiguration.class]
>   - userDSEmFactory: defined by method 'userDSEmFactory' in class path >resource [com/kodinor/configuration/UserDBConfiguration.class]
>
>
>Action:
>
>Consider marking one of the beans as @Primary, updating the consumer to >accept multiple beans, or using @Qualifier to identify the bean that should >be consumed<br>

我有两个配置文件:

    @Configuration
    @EnableTransactionManagement 
    @EnableJpaRepositories(basePackageClasses = UserRepository.class,  entityManagerFactoryRef = "userDSEmFactory", transactionManagerRef = "userDSTransactionManager")
    public class UserDBConfiguration {

        @Primary
        @Bean
        @ConfigurationProperties("spring.datasource1")
        public DataSourceProperties userDSProperties() {
        return new DataSourceProperties();
        }

        @Primary
        @Bean
        public DataSource userDS(@Qualifier("userDSProperties") DataSourceProperties userDSProperties) {
            return userDSProperties.initializeDataSourceBuilder().build();
        }

        @Bean
        public LocalContainerEntityManagerFactoryBean     userDSEmFactory(@Qualifier("userDS") DataSource userDS, EntityManagerFactoryBuilder builder) {
            return builder.dataSource(userDS).packages(User.class).build();
    }
        @Primary
        @Bean
        public PlatformTransactionManager userDSTransactionManager(EntityManagerFactory userDSEmFactory) {
        return new JpaTransactionManager(userDSEmFactory);
        }

    }
    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(basePackageClasses = ProductRepository.class,     entityManagerFactoryRef = "productDSEmFactory", transactionManagerRef = "productDSTransactionManager")
    public class ProductDBConfiguration {

        @Bean
        @ConfigurationProperties("spring.datasource2")
        public DataSourceProperties productDSProperties() {
        return new DataSourceProperties();
        }

        @Bean
        public DataSource productDS(@Qualifier("productDSProperties")  DataSourceProperties productDSProperties) {
        return productDSProperties.initializeDataSourceBuilder().build();
        }

        @Bean
        public LocalContainerEntityManagerFactoryBean productDSEmFactory(@Qualifier("productDS") DataSource productDS, EntityManagerFactoryBuilder builder) {
            return builder.dataSource(productDS).packages(Product.class).build();
        }

        @Bean
        public PlatformTransactionManager productDSTransactionManager(EntityManagerFactory productDSEmFactory) {
        return new JpaTransactionManager(productDSEmFactory);
        }

    }

应用程序属性:

    spring.jpa.hibernate.ddl-auto=create
    spring.jpa.generate-ddl=true

    spring.datasource1.url=jdbc:mysql://localhost:3306/userdb?autoReconnect=true&useSSL=false
    spring.datasource1.username=user
    spring.datasource1.password=pass

    spring.datasource2.url=jdbc:mysql://localhost:3306/productdb?autoReconnect=true&useSSL=false
    spring.datasource2.username=user
    spring.datasource2.password=pass

还有一个简单的主应用程序,它添加了一些初始化数据:

    @SpringBootApplication
    public class SpringDataManyDbsApplication {

        public static void main(String[] args) {
        SpringApplication.run(SpringDataManyDbsApplication.class, args);
        }

        @Autowired
        private UserRepository userRepository;

        @Autowired
        private ProductRepository productRepository;

        @PostConstruct
        void init () {

            User user = new User("john", "doe");
            userRepository.save(user);

            Product product = new Product("chair", 5);
            productRepository.save(product);
        }
}

我试图将@Primary 注释添加到 userDSEmFactory。错误消失,但产品数据不再保存。任何想法如何解决这个问题?我没有太多使用 Spring-boot 的经验,而且我已经阅读了几十篇文章,但许多文章似乎以不同的方式做事。非常感谢你帮助我!

更新

我已经像这样添加了@Primary 注释:

        @Primary  
        @Bean
        public LocalContainerEntityManagerFactoryBean     userDSEmFactory(@Qualifier("userDS") DataSource userDS, EntityManagerFactoryBuilder builder) {
            return builder.dataSource(userDS).packages(User.class).build();
    }

不,没有更多错误,但只有用户被保存在主数据库中,没有任何内容被保存到产品(第二个)数据库中。因此,如果有人有建议,那可能是什么原因..

标签: spring-boot

解决方案


您缺少@Primary注释userDSEmFactory

@Primary
@Bean
public LocalContainerEntityManagerFactoryBean userDSEmFactory(@Qualifier("userDS") DataSource userDS, EntityManagerFactoryBuilder builder) {
    return builder.dataSource(userDS).packages(User.class).build();
}

而且@EnableTransactionManagement在你的主课上使用一次也很好。


推荐阅读