spring-boot - 从 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();
}
不,没有更多错误,但只有用户被保存在主数据库中,没有任何内容被保存到产品(第二个)数据库中。因此,如果有人有建议,那可能是什么原因..
解决方案
您缺少@Primary
注释userDSEmFactory
@Primary
@Bean
public LocalContainerEntityManagerFactoryBean userDSEmFactory(@Qualifier("userDS") DataSource userDS, EntityManagerFactoryBuilder builder) {
return builder.dataSource(userDS).packages(User.class).build();
}
而且@EnableTransactionManagement
在你的主课上使用一次也很好。
推荐阅读
- reactjs - ReactJS Material UI inputbase 输入提取 - 未定义
- php - 如何使用 php 从 json 数据中正确获取 id 和标签名称和值
- mysql - 如何解决 vb.net 中的这个 SQL 语法错误?
- c - 如何在C中使用宏将符号更改为单词?
- python - 为什么 Django 在错误的目录中寻找模板
- python - pytube 一起下载过滤后的视频和音频
- ios - iOS 13.1 UITextView 委托方法 shouldInteract 仅在长按附件时调用
- c# - 如何防止在表单外放置图像?
- office-ui-fabric - 如何更改 DefaultButton 中项目容器的宽度?
- php - 如何将字符串与多维数组中的原始值和更改值连接起来?