Lafox.Net lafox.net
Spring Boot: dynamoDB via AWS SDK v2

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);

	}
}