文章同步到个人站点 Daniel Notes
背景
在多数据源工程中集成 DynamoDB 时遇到了 DynamoDB 的不支持多数据源的问题 ?
SpringBoot 集成 DynamoDB
大概讲一下我集成 DynamoDB 的方式,如果你的数据源只有 DynamoDB 那么下面的集成方式则可以正常工作。
首先引入 Maven 依赖
<dependency><groupId>com.github.derjust</groupId><artifactId>spring-data-dynamodb</artifactId><version>5.1.0</version></dependency>
DynamodbConfig 配置类
@Configuration
@EnableDynamoDBRepositories(basePackages = "DynamoDB Repository 所在的包路径")
public class DynamodbConfig {
@Value("${xxx.xxxx.connection-timeout:10000}")private int connectionTimeout;@Value("${xxx.xxxx.socket-timeout:30000}")private int socketTimeout;@Value("${xxx.xxxx.max-error-retry:0}")private int maxErrorRetry;@Bean(name = "amazonDynamoDB")public AmazonDynamoDB amazonDynamodb() {
return AmazonDynamoDBClientBuilder.standard().withClientConfiguration(new ClientConfiguration().withConnectionTimeout(connectionTimeout).withSocketTimeout(socketTimeout).withMaxErrorRetry(maxErrorRetry)).build();}
}
构建表的实体类
@Data
@DynamoDBTable(tableName = "UserInfo")
public class UserInfo implements Serializable {
@DynamoDBHashKey(attributeName = "udid")private String uid;
}
创建 Repository
@EnableScan
public interface UserInfoRepository extends CrudRepository<UserInfo, String> {
}
自此 SpringBoot 集成 DynamoDB 的部分已经完成,和 JPA 类似你可以在你的业务逻辑中使用 @Autowired
注入 UserInfoRepository
进行数据操作。
多数据源问题
我们的工程一般都不仅仅使用单一的数据源,DynamoDB 与关系型数据库「MySQL」结合是很常见的,但是集成方式和上面的有些需要注意的地方,否则会遇到如下所示的错误,这里补充一下,我同时在工程中使用了 JPA 的方式集成 MySQL。
***************************
APPLICATION FAILED TO START
***************************Description:Field userInfoRepository in xxx required a bean of type 'xxx.xxxx.UserInfoRepository' that could not be found.The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)Action:Consider defining a bean of type 'org.csulb.md.repo.UserInfoRepository' in your configuration.
这个问题的原因启动日志里面有提到,往上翻翻启动日志,你会看到如下的提示:
Spring Data DynamoDB does not support multi-store setups!.
也就是说 Spring Data DynamoDB
不支持多数据源,其实是因为 EnableDynamoDBRepositories
和 EnableJpaRepositories
的自动扫描存在冲突,导致扫描不到 DynamoDB 的 Repository,为了解决这个问题,应该修改 SpringBoot 的扫描范围,将 DynamodbConfig
改成如下模式,记得引入 org.springframework.stereotype.Repository
import org.springframework.stereotype.Repository;@EnableDynamoDBRepositories(basePackages = "DynamoDB Repository 所在的包路径",includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Repository.class))
同时在 Repository 上加上 @Repository
,接着你的工程又能正常工作了?
import org.springframework.stereotype.Repository;@Repository
@EnableScan
public interface UserInfoRepository extends CrudRepository<UserInfo, String> {
}
自此上述问题解决,两个数据源都能正常工作,enjoy ? bye~