Spring Boot: dynamoDB via AWS SDK v2
Create new Spring Boot project
Go to https://start.spring.io/ and add Dependency "Lombok". Click "Generate" button and open project in your favorite IDE
Add dependency
Add DynamoDB dependencyManagement to pom.xml:<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.17.267</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
and dependency:
<dependencies>
<!-- other dependencies -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>dynamodb-enhanced</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>dynamodb</artifactId>
</dependency>
</dependencies>
After all: pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>net.lafox.demo</groupId>
<artifactId>dynamodb-sdk-v2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dynamodb-sdk-v2</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
<!-- https://mvnrepository.com/artifact/software.amazon.awssdk/protocol-core -->
<awssdk.version>2.17.267</awssdk.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>dynamodb-enhanced</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>dynamodb</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>${awssdk.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
Create DynamoDbEnhancedClient bean:
package net.lafox.demo.dynamodbsdkv2.article;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
@Configuration
public class AwsServicesConfig {
Region region = Region.EU_CENTRAL_1;
String accessKeyId = "YOUR-ACCESS-KEY-ID";
String secretAccessKey = "YOUR-SECRET-ACCESS-KEY";
@Bean
public DynamoDbClient dynamoDbClient(AwsCredentialsProvider awsCredentialsProvider) {
return DynamoDbClient.builder()
.region(region)
.credentialsProvider(awsCredentialsProvider)
.build();
}
@Bean
public DynamoDbEnhancedClient dynamoDbEnhancedClient(DynamoDbClient dynamoDbClient) {
return DynamoDbEnhancedClient.builder()
.dynamoDbClient(dynamoDbClient)
.build();
}
@Bean
public AwsCredentialsProvider awsCredentialsProvider() {
AwsCredentials awsCredentials = AwsBasicCredentials.create(
accessKeyId,
secretAccessKey
);
return StaticCredentialsProvider.create(awsCredentials);
}
}
Create DynamoDb Entity:
package net.lafox.demo.dynamodbsdkv2.article;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean;
import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbPartitionKey;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@DynamoDbBean
public class Article {
Long id;
@DynamoDbPartitionKey
public Long getId() {
return id;
}
String title;
String content;
}
Create DAO service:
package net.lafox.demo.dynamodbsdkv2.article;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
import software.amazon.awssdk.enhanced.dynamodb.Key;
import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
@Service
@RequiredArgsConstructor
public class ArticleDao {
private final DynamoDbEnhancedClient dynamoDbEnhancedClient;
public Article getItem(Long id) {
return getMappedTable(Article.class).getItem(Key.builder().partitionValue(id).build());
}
public void save(Article article) {
getMappedTable(Article.class).putItem(article);
}
public List<Article> scan() {
return getMappedTable(Article.class).scan().items().stream().toList();
}
private <T> DynamoDbTable<T> getMappedTable(Class<T> type) {
return dynamoDbEnhancedClient.table("articles", TableSchema.fromBean(type));
}
}
Run Application:
package net.lafox.demo.dynamodbsdkv2;
import lombok.RequiredArgsConstructor;
import net.lafox.demo.dynamodbsdkv2.article.Article;
import net.lafox.demo.dynamodbsdkv2.article.ArticleDao;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@RequiredArgsConstructor
public class Application implements ApplicationRunner {
private final ArticleDao articleDao;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
Article article1 = Article.builder()
.id(1L)
.title("t1")
.content("c1")
.build();
Article article2 = Article.builder()
.id(2L)
.title("t2")
.content("c2")
.build();
articleDao.save(article1);
articleDao.save(article2);
for (Article article : articleDao.scan()) {
System.out.println("article = " + article);
}
Article a = articleDao.getItem(1L);
System.out.println("a = " + a);
}
}