Code Monkey home page Code Monkey logo

spring-data-dynamodb's Introduction

Build Status Maven Central

Spring Data DynamoDB

The primary goal of the Spring® Data project is to make it easier to build Spring-powered applications that use data access technologies.

This module deals with enhanced support for a data access layer built on AWS DynamoDB.

Technical infos can be found on the project page.

Supported Features

Demo application

For a demo of spring-data-dynamodb, using spring-data-rest to showcase DynamoDB repositories exposed with REST, please see spring-data-dynamodb-examples.

Quick Start

Download the JAR though Maven Central (SNAPSHOT builds are available via the OSSRH snapshot repository ):

<dependency>
  <groupId>io.github.boostchicken</groupId>
  <artifactId>spring-data-dynamodb</artifactId>
  <version>5.2.5</version>
</dependency>

Setup DynamoDB configuration as well as enabling Spring-Data DynamoDB repository support via Annotation (XML-based configuration)

Create a DynamoDB entity User for this table:

@DynamoDBTable(tableName = "User")
public class User {

	private String id;
	private String firstName;
	private String lastName;

	public User() {
		// Default constructor is required by AWS DynamoDB SDK
	}

	public User(String firstName, String lastName) {
		this.firstName = firstName;
		this.lastName = lastName;
	}

	@DynamoDBHashKey
	@DynamoDBAutoGeneratedKey
	public String getId() {
		return id;
	}

	@DynamoDBAttribute
	public String getFirstName() {
		return firstName;
	}

	@DynamoDBAttribute
	public String getLastName() {
		return lastName;
	}

	//setter & hashCode & equals
}

Create a CRUD repository interface UserRepository:

@EnableScan
public interface UserRepository extends CrudRepository<User, String> {
  List<User> findByLastName(String lastName);
  List<User> findByFirstName(String firstName);
}

or for paging and sorting...

public interface PagingUserRepository extends PagingAndSortingRepository<User, String> {
	Page<User> findByLastName(String lastName, Pageable pageable);
	Page<User> findByFirstName(String firstName, Pageable pageable);

	@EnableScan
	@EnableScanCount
	Page<User> findAll(Pageable pageable);
}

Create the configuration class DynamoDBConfig:

@Configuration
@EnableDynamoDBRepositories(basePackageClasses = UserRepository.class)
public static class DynamoDBConfig {

	@Value("${amazon.aws.accesskey}")
	private String amazonAWSAccessKey;

	@Value("${amazon.aws.secretkey}")
	private String amazonAWSSecretKey;

	public AWSCredentialsProvider amazonAWSCredentialsProvider() {
		return new AWSStaticCredentialsProvider(amazonAWSCredentials());
	}

	@Bean
	public AWSCredentials amazonAWSCredentials() {
		return new BasicAWSCredentials(amazonAWSAccessKey, amazonAWSSecretKey);
	}

	@Bean
	public DynamoDBMapperConfig dynamoDBMapperConfig() {
		return DynamoDBMapperConfig.DEFAULT;
	}

	@Bean
	public DynamoDBMapper dynamoDBMapper(AmazonDynamoDB amazonDynamoDB, DynamoDBMapperConfig config) {
		return new DynamoDBMapper(amazonDynamoDB, config);
	}

	@Bean
	public AmazonDynamoDB amazonDynamoDB() {
		return AmazonDynamoDBClientBuilder.standard().withCredentials(amazonAWSCredentialsProvider())
				.withRegion(Regions.US_EAST_1).build();
	}
}

And finally write a test client UserRepositoryIT or start calling it from your existing Spring code.

The full source code is available at spring-data-dynamodb-examples' simple example

More

More sample code can be found in the spring-data-dynamodb-examples project.

Advanced topics can be found in the wiki.

Version & Spring Framework compatibility

The major and minor number of this library refers to the compatible Spring framework version. The build number is used as specified by SEMVER.

API changes will follow SEMVER and loosly the Spring Framework releases.

spring-data-dynamodb version Spring Boot compatibility Spring Framework compatibility Spring Data compatibility
1.0.x >= 3.1 && < 4.2
4.2.x >= 1.3.0 && < 1.4.0 >= 4.2 && < 4.3 Gosling-SR1
4.3.x >= 1.4.0 && < 2.0 >= 4.3 && < 5.0 Gosling-SR1
4.4.x >= 1.4.0 && < 2.0 >= 4.3 && < 5.0 Hopper-SR2
4.5.x >= 1.4.0 && < 2.0 >= 4.3 && < 5.0 Ingalls
5.0.x >= 2.0 && < 2.1 >= 5.0 && < 5.1 Kay-SR1
5.1.x == 2.1 >= 5.1 Lovelace-SR1
5.2.x >= 2.2 >= 5.2 Moore-RELEASE, Nuemann-RELASE

spring-data-dynamodb depends directly on spring-data as also spring-context, spring-data and spring-tx.

compile and runtime dependencies are kept to a minimum to allow easy integration, for example into Spring-Boot projects.

History

The code base has some history already in it - let's clarify it a bit:

The Java package name/XSD namespace never changed from org.socialsignin.spring.data.dynamodb. But the XSD is now also available at https://boostchicken.github.io/spring-data-dynamodb/spring-dynamodb-1.0.xsd.

spring-data-dynamodb's People

Contributors

291277058 avatar alexarana avatar blx avatar boostchicken avatar boothen avatar cmleroy avatar daquino avatar dasniko avatar davinpidoto avatar dependabot[bot] avatar derjust avatar enriquezrene avatar felixwimpyw avatar frommeyerc avatar gauravbrills avatar hannes-angst avatar hfcipriano avatar lemikaelf avatar majusko avatar matthias-hampel avatar michaellavelle avatar mtedone avatar paulatbox avatar pettyalex avatar phaser4 avatar ryonday avatar srekapalli avatar treidel avatar vitolimandibhrata avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

spring-data-dynamodb's Issues

Simple test runs forever

Example project: https://github.com/hashworks/spring-data-dynamodb-test
Log: https://fb.hash.works/Cq5nifFy/

Expected Behavior

Test finishes.

Actual Behavior

Test runs forever.

Steps to Reproduce the Problem

  1. git clone https://github.com/hashworks/spring-data-dynamodb-test.git
  2. cd spring-data-dynamodb-test
  3. docker-compose up -d dynamodb
  4. mvn clean verify

Specifications

  • Spring Data DynamoDB Version: 5.2.5 (2.2)
  • Spring Data Version: 2.5.2
  • AWS SDK Version: 1.11.664
  • Java Version: 16.0.1 - OpenJDK 64-Bit Server VM 16.0.1+9
  • Platform Details: Linux 5.12.14-arch1-1

Support for QueryDSL

Expected Behavior

Able to use QueryDSL with DynamoDB

Actual Behavior

QueryDsl Support has not been implemented yet

Steps to Reproduce the Problem

  1. extend QueryDSLPredicateExecutor

If not this, is there another way to use Specification or query using complex queries?

Vulnerability with cdi-api dependency

Hi, we currently use the latest version of your spring data dynamo-db (5.2.5) as one of our maven dependencies, and it has reported a vulnerability CVE-2014-8122 with cdi-api jar which is one of your dependencies. Could you look at an alternative and fix this?

Specifications

  • Spring Data DynamoDB Version: 5.2.5
  • Spring Data Version:2.3.3.RELEASE
  • AWS SDK Version:1.11.859
  • Java Version: Java 8
  • Platform Details: Mac OS

@Query annotation with fields list is not working,

Expected Behavior

@query annotation should fetch only those attributes which we have mentioned under field.

Actual Behavior

@query annotation is not working. I have mentioned only 2 attribute but its fetching all attributes from Dynamo.

Steps to Reproduce the Problem

  1. Create a @query annotation in Repository class with some attributes.
    example -

       @Query(fields = "IMEI Number , Battery Voltage" )
       Page<GpsSensor> findByImeiIn(Iterable<String> primaryKeys,Pageable pageable);
    

    The above method should only fetch IMEI number and Battery Volatage only but its fetching all attribute from dynamo.

Specifications

  • Spring Data DynamoDB Version: 5.2.1
  • Spring Data Version:
  • AWS SDK Version: 1.11.573
  • Java Version: 1.8
  • Platform Details: Java , Spring Boot

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Entity - Data mapping using reflection

Expected Behavior

At first time, I think 'spring-data-dynamodb use reflection to entity'.
so that, kotlin property can be assigned when access modifier is 'val' (no setter access modifier)
because JPA does like that.

Actual Behavior

'val' property can't be assigned value.

Steps to Reproduce the Problem

  1. Make class, the access modifier of class property is "val"
  2. execute query, e.g) findAll()

Specifications

  • Spring Data DynamoDB Version: 5.2.5
  • Spring Data Version:
  • AWS SDK Version:
  • Java Version: 11
  • Platform Details:

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Always thanks for your kindness.

Add support for @AccessType(AccessType.Type.FIELD)

Expected Behavior

I would like to remove setters and getters from entity class and replace them with annotation:
@AccessType(AccessType.Type.FIELD)

Actual Behavior

com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: Example; no mapping for HASH key

Steps to Reproduce the Problem

  1. Create class with annotations
@DynamoDBTable(tableName = "ExampleTable")
@NoArgsConstructor(access = PRIVATE)
@AllArgsConstructor(access = PRIVATE)
@AccessType(FIELD)
public class Example {

    @DynamoDBHashKey
    private UUID id;
    private UUID taskId;
  
 }
  1. Try to save entity through the repository
@Repository
interface DynamoDbExampleRepository extends CrudRepository<Example, UUID> {

    Optional<Example> findByTaskId(final UUID taskId);

}

Specifications

  • Spring Data DynamoDB Version: 5.2.5
  • Spring Data Version: 2.4.0
  • AWS SDK Version: 1.11.951

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Can't batch update

Expected Behavior

Actual Behavior

Steps to Reproduce the Problem

Specifications

  • Spring Data DynamoDB Version:
  • Spring Data Version:
  • AWS SDK Version:
  • Java Version:
  • Platform Details:

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Why key querying are returning a list with null element instead a empty list?

When I invoke a repository method that makes a key search in dynamo:

enter image description here

"{"TableName":"music","Key":{"artist":{"S":"Djavan"},"title":{"S":"Tempo"}},"ConsistentRead":false}"

this is aws output:

"{}"

And when i invoke another methos that makes a find using sortKey start with:

enter image description here

this is sent to aws:

"{"TableName":"music","ConsistentRead":true,"KeyConditions":{"artist":{"AttributeValueList":[{"S":"Djavan"}],"ComparisonOperator":"EQ"},"title":{"AttributeValueList":[{"S":"Tempo"}],"ComparisonOperator":"BEGINS_WITH"}},"ScanIndexForward":true}"

and this is the return:

"{"Count":0,"Items":[],"ScannedCount":0}"

Steps to Reproduce the Problem

Using a entity named Music

@DynamoDBTable(tableName = "music")
data class Music(

        @get:DynamoDBHashKey(attributeName = "artist")
        var artist: String? = null,

        @get:DynamoDBRangeKey(attributeName = "title")
        var title: String? = null,

        var genre: String? = null
) {

    @Id
    private var id: MusicId? = null
        get() = MusicId(artist, title)
}

@DynamoDBDocument
data class MusicId(

        @field:DynamoDBHashKey(attributeName = "artist")
        var artist: String? = null,

        @field:DynamoDBRangeKey(attributeName = "title")
        var title: String? = null
) : Serializable

And a repository

interface MusicRepository : CrudRepository<Music, MusicId> {

    fun findByArtistAndTitle(artist: String, title: String): List<Music>

    fun findByArtistAndTitleStartingWith(artista: String, sortKey: String): List<Music>
}

And when i invoke:

@PostConstruct
    fun init() {
        println(musicRepository.findByArtistAndTitleStartingWith("Djavan", "Eu te devoro").joinToString())
    }

the log show's me the call to AWS as i showed above

Specifications

Stackoverflow question: https://stackoverflow.com/questions/65996950/why-spring-data-dynamodb-are-returning-a-list-with-null-element-instead-a-empty

Someone know if is there a clean way to guarantee that the dynamo repo will never return a list that only accepts non null elements, with null elements?

unresolvable circular references updating from 5.0.3

It looks like there are some new bean factories trying to inject instances of AmazonDynamoDB, DynamoDBMapperConfig, etc.

Is there a way to turn them off and simply use the beans we already have configured?

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dynamoDB-DynamoDBMapper': Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'dynamoDBMapperConfig': Requested bean is currently in creation: Is there an unresolvable circular reference?

Looks like this popped up in v5.1.0, so before your fork.

Requested resource not found after changing dependency from `derjust` to `boostchicken`

Expected Behavior

No errors after changing dependencies

Actual Behavior

Error has been thrown:
com.amazonaws.services.dynamodbv2.model.ResourceNotFoundException: Requested resource not found (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ResourceNotFoundException; Request ID: L2MEI7VNNBCSFDDE17VU6FA8P3VV4KQNSO5AEMVJF66Q9ASUAAJG; Proxy: null) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1819) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleServiceErrorResponse(AmazonHttpClient.java:1403) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1372) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1145) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:802) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:770) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:744) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:704) at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:686) at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:550) at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:530) at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.doInvoke(AmazonDynamoDBClient.java:6214) at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:6181) at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.executeQuery(AmazonDynamoDBClient.java:3931) at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.query(AmazonDynamoDBClient.java:3895) at org.socialsignin.spring.data.dynamodb.core.DynamoDBTemplate.query(DynamoDBTemplate.java:178) at org.socialsignin.spring.data.dynamodb.query.MultipleEntityQueryRequestQuery.getResultList(MultipleEntityQueryRequestQuery.java:38) at org.socialsignin.spring.data.dynamodb.query.AbstractMultipleEntityQuery.getSingleResult(AbstractMultipleEntityQuery.java:36) at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQuery$SingleEntityExecution.execute(AbstractDynamoDBQuery.java:282) at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQuery.execute(AbstractDynamoDBQuery.java:311) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:618) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:605) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) at com.sun.proxy.$Proxy128.findByCognitoUserName(Unknown Source) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) at com.sun.proxy.$Proxy128.findByCognitoUserName(Unknown Source)

Steps to Reproduce the Problem

  1. Change dependency from com.github.derjust:spring-data-dynamodb:5.2.1 to io.github.boostchicken:spring-data-dynamodb:5.2.5
  2. Run the Spring boot project
  3. Use any method from Spring Repository

Specifications

  • Spring Data DynamoDB Version: 5.2.5 (2.2)
  • Spring Data Version: 2.2.3.RELEASE
  • AWS SDK Version: 1.11.1000
  • Java Version: 11.0.9.1 - OpenJDK 64-Bit Server VM 11.0.9.1+1
  • Platform Details: Windows 10 10.0

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Reactive support

Feature request, porting it initially from here: derjust#138

It would be great having support for the reactive spring boot stack.

Currently, i'm getting:

org.springframework.dao.InvalidDataAccessApiUsageException: Reactive Repositories are not supported by DynamoDB. Offending repository is com.example.app.repository.ItemRepository!

The repository looks like:

package com.example.app.repository;

import com.example.app.model.Item;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import reactor.core.publisher.Mono;

// ReactiveSortingRepository maybe and pageable
public interface ItemRepository extends ReactiveCrudRepository<Item, Integer> {
  Mono<RawItem> findRawItemById(Integer id);
}

DynamoDBMapperConfig.PaginationLoadingStrategy.ITERATION_ONLY is not compatible with scan queries

Expected Behavior

It's possible to run queries that filter by a value with DynamoDBMapperConfig.PaginationLoadingStrategy.ITERATION_ONLY

Actual Behavior

You get the following error:

java.lang.UnsupportedOperationException: The list could only be iterated once in ITERATION_ONLY mode.
	at com.amazonaws.services.dynamodbv2.datamodeling.PaginatedList$PaginatedListIterator.<init>(PaginatedList.java:231)
	at com.amazonaws.services.dynamodbv2.datamodeling.PaginatedList.iterator(PaginatedList.java:204)
	at java.util.Spliterators$IteratorSpliterator.estimateSize(Spliterators.java:1821)

Steps to Reproduce the Problem

  1. Set up the following DynamoDBMapperConfig
    @Bean
    public DynamoDBMapperConfig dynamoDBMapperConfig() {
        return new DynamoDBMapperConfig.Builder()
       .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.UPDATE_SKIP_NULL_ATTRIBUTES)
       .withConsistentReads(DynamoDBMapperConfig.ConsistentReads.EVENTUAL)
.withPaginationLoadingStrategy(DynamoDBMapperConfig.PaginationLoadingStrategy.ITERATION_ONLY)
.withBatchWriteRetryStrategy(DynamoDBMapperConfig.DefaultBatchWriteRetryStrategy.INSTANCE)
.withBatchLoadRetryStrategy(DynamoDBMapperConfig.DefaultBatchLoadRetryStrategy.INSTANCE)
.withTypeConverterFactory(DynamoDBTypeConverterFactory.standard())
.withConversionSchema(ConversionSchemas.V2)
.build();

    }
  1. In your repository have a findBy method
@EnableScan
public interface FooRepository extends CrudRepository<FooTableItem, String>{
    Iterable<FooItem> findByStatus(String status);
}
  1. Execute the query and try to iterate over the results
private void doIt {
        Iterable<FooItem> items = fooRepository.findByStatus("NEW");
        List<Bar> results = new ArrayList<>();
        items.forEach(item -> {
            try {
                results.add(item.toContext());
            } catch (Throwable t) {
                log.error("Failed to deserialize failure", t);
            }
        });
        return results;
    }

Note:
Setting a breakpoint on https://github.com/aws/aws-sdk-java/blob/1.11.794/aws-java-sdk-dynamodb/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/PaginatedList.java#L230 will show you that the PaginatedListIterator was called before the forLoop got there with the following stack.

<init>:234, PaginatedList$PaginatedListIterator (com.amazonaws.services.dynamodbv2.datamodeling)
iterator:204, PaginatedList (com.amazonaws.services.dynamodbv2.datamodeling)
requiresConversion:188, QueryExecutionResultHandler (org.springframework.data.repository.core.support)
postProcessInvocationResult:157, QueryExecutionResultHandler (org.springframework.data.repository.core.support)
postProcessInvocationResult:77, QueryExecutionResultHandler (org.springframework.data.repository.core.support)
invoke:605, RepositoryFactorySupport$QueryExecutorMethodInterceptor (org.springframework.data.repository.core.support)
proceed:186, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:95, ExposeInvocationInterceptor (org.springframework.aop.interceptor)
proceed:186, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:212, JdkDynamicAopProxy (org.springframework.aop.framework)
findByStatus:-1, $Proxy154 (com.sun.proxy)
-REDACTED-
-REDACTED-
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
run:84, ScheduledMethodRunnable (org.springframework.scheduling.support)
run:54, DelegatingErrorHandlingRunnable (org.springframework.scheduling.support)
call:511, Executors$RunnableAdapter (java.util.concurrent)
runAndReset$$$capture:308, FutureTask (java.util.concurrent)
runAndReset:-1, FutureTask (java.util.concurrent)
 - Async stack trace
<init>:151, FutureTask (java.util.concurrent)
<init>:219, ScheduledThreadPoolExecutor$ScheduledFutureTask (java.util.concurrent)
scheduleAtFixedRate:570, ScheduledThreadPoolExecutor (java.util.concurrent)
scheduleAtFixedRate:348, ThreadPoolTaskScheduler (org.springframework.scheduling.concurrent)
scheduleFixedRateTask:479, ScheduledTaskRegistrar (org.springframework.scheduling.config)
scheduleFixedRateTask:453, ScheduledTaskRegistrar (org.springframework.scheduling.config)
scheduleTasks:374, ScheduledTaskRegistrar (org.springframework.scheduling.config)
afterPropertiesSet:349, ScheduledTaskRegistrar (org.springframework.scheduling.config)
finishRegistration:302, ScheduledAnnotationBeanPostProcessor (org.springframework.scheduling.annotation)
onApplicationEvent:233, ScheduledAnnotationBeanPostProcessor (org.springframework.scheduling.annotation)
onApplicationEvent:105, ScheduledAnnotationBeanPostProcessor (org.springframework.scheduling.annotation)
doInvokeListener:172, SimpleApplicationEventMulticaster (org.springframework.context.event)
invokeListener:165, SimpleApplicationEventMulticaster (org.springframework.context.event)
multicastEvent:139, SimpleApplicationEventMulticaster (org.springframework.context.event)
publishEvent:403, AbstractApplicationContext (org.springframework.context.support)
publishEvent:360, AbstractApplicationContext (org.springframework.context.support)
finishRefresh:897, AbstractApplicationContext (org.springframework.context.support)
finishRefresh:162, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context)
refresh:553, AbstractApplicationContext (org.springframework.context.support)
refresh:141, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context)
refresh:747, SpringApplication (org.springframework.boot)
refreshContext:397, SpringApplication (org.springframework.boot)
run:315, SpringApplication (org.springframework.boot)
run:1226, SpringApplication (org.springframework.boot)
run:1215, SpringApplication (org.springframework.boot)
REDACTED

Specifications

  • Spring Data DynamoDB Version: 5.2.4 (2.2)
  • Spring Data Version: 2.2.7.RELEASE
  • AWS SDK Version: 1.11.790
  • Java Version: 1.8.0_181 - Java HotSpot(TM) 64-Bit Server VM 25.181-b13
  • Platform Details: Mac OS X 10.15.5

DynamoDBIndexHashKey bug with TableNamePrefix

Expected Behavior

set DynamoDBMapperConfig with the TableNamePrefix,the find result should come from table "TableNamePrefix+tablename"

Actual Behavior

the result come from table "tablename"

Steps to Reproduce the Problem

set DynamoDBMapperConfig
@Primary @Bean public DynamoDBMapperConfig dynamoDBMapperConfig() { return DynamoDBMapperConfig.builder() .withTableNameOverride( DynamoDBMapperConfig.TableNameOverride.withTableNamePrefix(tableNamePrefix) ).build(); }
add DynamoDBIndexHashKey
@DynamoDBIndexHashKey(globalSecondaryIndexName = "username-index")

use Repository do the find method

Specifications

  • Spring Data DynamoDB Version: 5.2.5
  • Spring Data Version:Moore-RELEASE
  • AWS SDK Version:2.7.7
  • Java Version: 8
  • Platform Details: linux

.Query annotation does not catch filter expression. It is always EQ.

Expected Behavior

  @Query(
      fields = "transition_effective_date",
      filterExpression = "#field > :value",
      expressionMappingNames = {@ExpressionAttribute(key = "#field", value = "name")},
      expressionMappingValues = {@ExpressionAttribute(key = ":value", value = "projection")})

This should return all greater than the value, but instead return only the equal one.

Actual Behavior

Return only the equal one.

Steps to Reproduce the Problem

  1. Create a repository
  2. Add some records.
  3. Create a query with filter expression different than "=".

image

Specifications

  • Spring Data DynamoDB Version: 5.2.5
  • Spring Data Version:
  • AWS SDK Version: 2.16.46
  • Java Version: 17
  • Platform Details:

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Scan operation is performed even when a valid GSI exists for the query

Expected Behavior

Lets say I have a documents table with document_id of type String as HASH_KEY.
I have created a GSI for that table with department_id (of type Number) as HASH KEY and category_id (of type Number) as RANGE KEY

So a department can have multiple documents and each document has one document category.

My repository looks like this:

public interface DepartmentIdCategoryIdRepository
extends PagingAndSortingRepository<DocumentMetadata, DepartmentIdCategoryId> {

List findAllByDepartmentIdAndCategoryIdIn(Integer departmentId, List categoryId);
}

DepartmentIdCategoryId is composite GSI (department_id HASH and category_id RANGE) as mentioned above

When I invoke findAllByDepartmentIdAndCategoryIdIn a scan operation is being performed.

As a valid GSI exists for the above find operation, scan should not be performed and hence @EnableScan is not required

This issue is similar to -> derjust#162

Actual Behavior

I am getting the below error:

java.lang.IllegalArgumentException: Scanning for this query is not enabled. To enable annotate your repository method with @EnableScan, or enable scanning for all repository methods by annotating your repository interface with @EnableScan

Steps to Reproduce the Problem

  1. Create a dynamodb table with document_id as HASH_KEY
  2. Create a GSI with department_id as HASH_KEY and category_id as RANGE_KEY
  3. Define a find method in the repository querying the GSI with document_id hash key and list of category_id range key (IN clause)

Specifications

  • Spring Boot Version: 2.2.5.RELEASE
  • Spring Data DynamoDB Version: 5.2.3
  • Spring Data Version: Moore-SR5
  • AWS SDK Version: 1.11.415
  • Java Version: 8
  • Platform Details: Windows 10 64bit

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Log for reference:

java.lang.IllegalArgumentException: Scanning for this query is not enabled. To enable annotate your repository method with @EnableScan, or enable scanning for all repository methods by annotating your repository interface with @EnableScan
at org.springframework.util.Assert.isTrue(Assert.java:118) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.socialsignin.spring.data.dynamodb.query.MultipleEntityScanExpressionQuery.assertScanEnabled(MultipleEntityScanExpressionQuery.java:41) ~[spring-data-dynamodb-5.2.3.jar:5.2.3]
at org.socialsignin.spring.data.dynamodb.query.MultipleEntityScanExpressionQuery.getResultList(MultipleEntityScanExpressionQuery.java:36) ~[spring-data-dynamodb-5.2.3.jar:5.2.3]
at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQuery$CollectionExecution.execute(AbstractDynamoDBQuery.java:104) ~[spring-data-dynamodb-5.2.3.jar:5.2.3]
at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQuery.execute(AbstractDynamoDBQuery.java:311) ~[spring-data-dynamodb-5.2.3.jar:5.2.3]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:618) ~[spring-data-commons-2.2.5.RELEASE.jar:2.2.5.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:605) ~[spring-data-commons-2.2.5.RELEASE.jar:2.2.5.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) ~[spring-aop-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at com.sun.proxy.$Proxy119.findAllByDepartmentIdAndCategoryIdIn (Unknown Source) ~[na:na]
at com.lmig.gs.surety.docmgmt.metadata.agency.controller.DepartmentMetadataController.getAllByDepartmentId(DepartmentMetadataController.java:110) ~[classes/:na]

Implement transaction support for dynamodb

Expected Behavior

It would be nice to implement transaction support for dynamodb since now the aws sdk supports transaction. So, we can implement Spring PlatformTransactionManager and provide support to annotate service methods to be transactional.

Actual Behavior

No transactions yet

Steps to Reproduce the Problem

None

Specifications

  • Spring Data DynamoDB Version:
  • Spring Data Version:
  • AWS SDK Version:
  • Java Version:
  • Platform Details:

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Implement OR Queries

My entity contains a field of type Set<String> countries (stringSet). I want to query against it with two country (query value, default value).

Expected Behavior

Iterable<ProductEntity> findAllByCountriesContainsOrCountriesContains(Set<String> a, Set<String> b); returns a list of products, that contains country a or country b in their countries fields.

Actual Behavior

java.lang.UnsupportedOperationException: Or queries not supported
	at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCreator.or(AbstractDynamoDBQueryCreator.java:205) ~[spring-data-dynamodb-5.2.4.jar:5.2.4]
	at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCreator.or(AbstractDynamoDBQueryCreator.java:49) ~[spring-data-dynamodb-5.2.4.jar:5.2.4]

Specifications

  • Spring Data DynamoDB Version: 5.2.4 (2.2)
  • Spring Data Version: 2.3.1.RELEASE
  • AWS SDK Version: 1.11.415
  • Java Version: 11.0.2 - OpenJDK 64-Bit Server VM 11.0.2+9
  • Platform Details: Mac OS X 10.15.4

Respository performing scan instead of query

Expected Behavior

Repository perform a query over a method that only uses hashKey and rangeKey attributes, and result this:

"{"TableName":"music","KeyConditionExpression":"artist = :_artist and begins_with(title, :_title)","ExpressionAttributeValues":{":_artist":{"S":"Djavan"},":_title":{"S":"Eu te devoro"}}}"

Actual Behavior

Repository perform a scanFilter over a method that only uses hashKey and rangeKey attributes, and result this:

"{"TableName":"music","ScanFilter":{"artist":{"AttributeValueList":[{"S":"Djavan"}],"ComparisonOperator":"EQ"},"title":{"AttributeValueList":[{"S":"Eu te devoro"}],"ComparisonOperator":"BEGINS_WITH"}}}"

Steps to Reproduce the Problem

Using a entity named Music

@DynamoDBTable(tableName = "music")
data class Music(
        @field:Id
        @DynamoDBIgnore
        val id: MusicId = MusicId(),

        var genre: String? = null
) {
    @DynamoDBHashKey(attributeName = "artist")
    fun getArtist() = id.artist

    fun setArtist(artist: String) {
        id.artist = artist
    }

    @DynamoDBHashKey(attributeName = "title")
    fun getTitle() = id.title

    fun setTitle(title: String) {
        id.title = title
    }

}

@DynamoDBDocument
data class MusicId(
        @field:DynamoDBHashKey(attributeName = "artist")
        var artist: String? = null,

        @field:DynamoDBRangeKey(attributeName = "title")
        var title: String? = null
) : Serializable

And a repository

@EnableScan //I know that if I remove this annotation, enables won't be permitted, but the problem is that the implementation code doesn't recognize my method as a key query and if I remove this annotation, the method falls on invocation
interface MusicRepository : CrudRepository<Music, MusicId> {

    fun findByArtistAndTitleStartingWith(artista: String, sortKey: String): List<Music>
}

And when i invoke:

@PostConstruct
    fun init() {
        println(musicRepository.findByArtistAndTitleStartingWith("Djavan", "Eu te devoro").joinToString())
    }

the log show's me the call to AWS as i showed above

Specifications

  • Spring Data DynamoDB Version: 5.2.5
  • Spring Data Version: Doesn't used
  • Spring Boot Starter Web Version: 2.3.4.RELEASE
  • AWS SDK Version: 1.11.573
  • Java Version: 11
  • Platform Details: Windows

Annotation @Query does not support Non-String Type

@query(filterExpression = "#field = :value", consistentReads = QueryConstants.ConsistentReadMode.EVENTUAL,
expressionMappingNames = {@ExpressionAttribute(key = "#field", value = "key")},
expressionMappingValues = {@ExpressionAttribute(key = ":value", parameterName = "key")})
List findByUidAndDeviceId(@param("uid") String uid, @param("device_id") String deviceId, @param("key") Integer key);

Expected Behavior

I want QueryFilter with Number type, But It doesn't support

Actual Behavior

Throws ClassCastException

which happens in {@DynamoDBEntityWithHashAndRangeKeyCriteria} line 216

queryExpression.addExpressionAttributeValuesEntry(value.key(), new AttributeValue(mappedExpressionValues.get(value.parameterName())));

the AttributeValue constructor only support String type value

Steps to Reproduce the Problem

Specifications

  • Spring Data DynamoDB Version: 5.2.5
  • Spring Data Version: 2.5.2
  • AWS SDK Version:
  • Java Version: 8
  • Platform Details:

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Getting error You have defined query method in the repository but you don't have any query lookup strategy defined. The infrastructure apparently does not support query methods!

Expected Behavior

Repository method should return records as per filter criteria stated in @query

Actual Behavior

During the springboot application start up it fails with below error
Getting error You have defined query method in the repository but you don't have any query lookup strategy defined. The infrastructure apparently does not support query methods!
Complete error:
2021-07-11 15:45:34.632 INFO 30940 --- [ main] o.s.s.d.d.r.s.DynamoDBRepositoryFactory : Spring Data DynamoDB Version: 5.2.5 (2.2)
2021-07-11 15:45:34.634 INFO 30940 --- [ main] o.s.s.d.d.r.s.DynamoDBRepositoryFactory : Spring Data Version: 2.0.9.RELEASE
2021-07-11 15:45:34.635 INFO 30940 --- [ main] o.s.s.d.d.r.s.DynamoDBRepositoryFactory : AWS SDK Version: 1.11.771
2021-07-11 15:45:34.635 INFO 30940 --- [ main] o.s.s.d.d.r.s.DynamoDBRepositoryFactory : Java Version: 11.0.4 - OpenJDK 64-Bit Server VM 11.0.4+10-b304.77
2021-07-11 15:45:34.635 INFO 30940 --- [ main] o.s.s.d.d.r.s.DynamoDBRepositoryFactory : Platform Details: Windows 10 10.0
2021-07-11 15:45:34.635 WARN 30940 --- [ main] o.s.s.d.d.r.s.DynamoDBRepositoryFactory : This Spring Data DynamoDB implementation might not be compatible with the available Spring Data classes on the classpath!
NoDefClassFoundExceptions or similar might occur!
2021-07-11 15:45:34.823 WARN 30940 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dynamoDbController': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dynamoDbRepository': Unsatisfied dependency expressed through field 'myCRUDRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myCRUDRepository': Invocation of init method failed; nested exception is java.lang.IllegalStateException: You have defined query method in the repository but you don't have any query lookup strategy defined. The infrastructure apparently does not support query methods!
2021-07-11 15:45:34.828 INFO 30940 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]

Steps to Reproduce the Problem

  1. Create springboot app with
org.springframework.boot spring-boot-starter-parent 2.0.4.RELEASE org.springframework.boot spring-boot-starter-web com.amazonaws aws-java-sdk-dynamodb 1.11.771 io.github.boostchicken spring-data-dynamodb 5.2.5 org.springframework.boot spring-boot-starter-test test 1. Then create a custom crud Repository

package com.springboot.repository;

import com.springboot.model.Student;
import com.springboot.model.StudentKey;
import org.socialsignin.spring.data.dynamodb.repository.EnableScan;
import org.socialsignin.spring.data.dynamodb.repository.ExpressionAttribute;
import org.socialsignin.spring.data.dynamodb.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

import java.util.List;
@EnableScan
public interface MyCRUDRepository extends CrudRepository<Student, StudentKey> {
@query(filterExpression = "contains(#field, :value)",
expressionMappingNames = {@ExpressionAttribute(key = "#field", value = "firstName")},
expressionMappingValues = {@ExpressionAttribute(key=":value", parameterName = "firstName")})
List findList(@param("firstName") String firstName);
}

Model Classes:

package com.springboot.model;

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey;

import java.io.Serializable;

public class StudentKey implements Serializable {
private static final long serialVersionUID = 2310511711421469613L;

public StudentKey() {
}

public StudentKey(String studentId) {
    this.studentId = studentId;
}

private String studentId;


public StudentKey(String studentId, String lastName) {
    this.studentId = studentId;
    this.lastName = lastName;
}

@DynamoDBHashKey(attributeName = "studentId")
@DynamoDBAutoGeneratedKey
public String getStudentId() {
    return studentId;
}

public void setStudentId(String studentId) {
    this.studentId = studentId;
}
@DynamoDBRangeKey
public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

private String lastName;

}
package com.springboot.model;

import java.io.Serializable;

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument;

@DynamoDBDocument
public class Address implements Serializable {

private static final long serialVersionUID = 1L;

private String addressLine1;
private String addressLine2;
private String state;
private String city;
private String zipCode;

@DynamoDBAttribute
public String getAddressLine1() {
	return addressLine1;
}

public void setAddressLine1(String addressLine1) {
	this.addressLine1 = addressLine1;
}

@DynamoDBAttribute
public String getAddressLine2() {
	return addressLine2;
}

public void setAddressLine2(String addressLine2) {
	this.addressLine2 = addressLine2;
}

@DynamoDBAttribute
public String getState() {
	return state;
}

public void setState(String state) {
	this.state = state;
}

@DynamoDBAttribute
public String getCity() {
	return city;
}

public void setCity(String city) {
	this.city = city;
}

@DynamoDBAttribute
public String getZipCode() {
	return zipCode;
}

public void setZipCode(String zipCode) {
	this.zipCode = zipCode;
}

}

package com.springboot.model;

import java.io.Serializable;

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
import org.springframework.data.annotation.Id;

@DynamoDBTable(tableName = "student")
public class Student implements Serializable {

private static final long serialVersionUID = 1L;
@DynamoDBHashKey(attributeName = "studentId")
public String getId() {
	return (id != null)?id.getStudentId():null;
}

public void setId(String studentId) {
	if (this.id == null) {
		this.id = new StudentKey(studentId);
	} else {
		this.id.setStudentId(studentId);
	}
}
@Id
StudentKey id;


@DynamoDBRangeKey(attributeName = "lastName")
public String getLastName() {
	return id != null ? id.getLastName() : null;
}

public void setLastName(String lastName) {
	if (this.id == null) {
		this.id = new StudentKey();
	}
	this.id.setLastName(lastName);
}

private String firstName;
private String age;
private Address address;



@DynamoDBAttribute
public String getFirstName() {
	return firstName;
}

public void setFirstName(String firstName) {
	this.firstName = firstName;
}



@DynamoDBAttribute
public String getAge() {
	return age;
}

public void setAge(String age) {
	this.age = age;
}

@DynamoDBAttribute
public Address getAddress() {
	return address;
}

public void setAddress(Address address) {
	this.address = address;
}

}

main] o.s.s.d.d.r.s.DynamoDBRepositoryFactory : This Spring Data DynamoDB implementation might not be compatible with the available Spring Data classes on the classpath!

Specifications

  • Spring Data DynamoDB Version: 5.2.5 (2.2)
  • Spring Data Version: 2.0.9.RELEASE
  • AWS SDK Version: 1.11.771
  • Java Version: 11.0.4 - OpenJDK 64-Bit Server VM 11.0.4+10-b304.77
  • Platform Details: Windows 10 10.0

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Not authorized to perform: dynamodb:PutItem on resource in EKS

Expected Behavior

Actual Behavior

User: arn:aws:sts:::assumed-role//aws-sdk-java-1649071401744 is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:ap-southeast-1::table/

(Service: AmazonDynamoDBv2; Status Code: 400; Error Code: AccessDeniedException; Request ID: A400G97E6PDN6AOU3OEOH1O5AEMVJF66Q9ASUAAJG

Steps to Reproduce the Problem

  1. Deploy in EKS
  2. Use AWS role / arn

Specifications

  • Spring Data DynamoDB Version: 5.2.5
  • Spring Data Version: 2.5.10
  • AWS SDK Version: 1.11.914
  • Java Version: 14
  • Platform Details: EKS

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Ability to apply filter expressions to Query for Numbers and Boolean fields

With Reference to
#27 and
https://github.com/boostchicken/spring-data-dynamodb/wiki/Change-Log

We now have an option to filter the Query Result using filterExpression as below.

With static parameters

@query(fields = "leaveDate", limit = 1, filterExpression = "contains(#field, :value)",
expressionMappingNames = {@ExpressionAttribute(key = "#field", value = "name")},
expressionMappingValues = {@ExpressionAttribute(key=":value", value = "projection")})
List findByPostCode(String postCode);

With dynamic parameters from methods

@Query(fields = "leaveDate", limit = 1, filterExpression = "contains(#field, :value)",
		expressionMappingNames = {@ExpressionAttribute(key = "#field", value = "name")},
		expressionMappingValues = {@ExpressionAttribute(key=":value", parameterName = "projection")})
List<User> findByPostCode(@Param("postCode") String postCode, @Param("projection") String projection);

But Is there any option or feature available to filter the result based on a field which is of Type Number and Boolean.
Let's say In Table I have Price column of type Number and I want to filter the final result based on Price >=100.
Then how can we achieve it with filterExpression as ExpressionAttribute has only key, value and parameterName which all are of type String.

Specifications

  • Spring Data DynamoDB Version: 5.2.5
  • Spring Data Version: 2.2.4.RELEASE
  • AWS SDK Version: 1.11.771
  • Java Version: 8
  • Platform Details: Windows 10

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

The Specification-Version property of the maven-jar-plugin is outdated

Expected Behavior

When the DynamoDBREpositoryFactory is invoked, the version of spring-data-commons referenced in the pom.xml file should be recognized as the correct one.

Actual Behavior

When the DynamoDBREpositoryFactory is invoked, the following warning is logged:

This Spring Data DynamoDB implementation might not be compatible with the available Spring Data classes on the classpath!
NoDefClassFoundExceptions or similar might occur!

Because the version in the manifest file, doesn't match the version of the actual dependency.

Steps to Reproduce the Problem

  1. Configure a spring boot project according to your documentation, and check the log
  2. You can also just check your pom.xml file where this is the spring data version you reference
    <spring-data.version>2.3.0.RELEASE</spring-data.version>
    while this is what you put in the manifest file:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
            </manifest>
            <manifestEntries>
                <Specification-Title>Spring Data</Specification-Title>
                <Specification-Version>2.2</Specification-Version>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

Specifications

  • Spring Data DynamoDB Version: 5.2.5 (2.2)
  • Spring Data Version: 2.3.0.RELEASE
  • AWS SDK Version: 1.11.664
  • Java Version: 11.0.3 - OpenJDK 64-Bit Server VM 11.0.3+7-LTS
  • Platform Details: Mac OS X 10.15.7

Spring-Boot 2.4.3 breaking changes for spring-data-dynamodb

/db/config/DynamoDBConfig.java:3:26 java: package com.amazonaws.auth does not exist /db/config/DynamoDBConfig.java:4:26 java: package com.amazonaws.auth does not exist /db/config/DynamoDBConfig.java:5:26 java: package com.amazonaws.auth does not exist /db/config/DynamoDBConfig.java:6:26 java: package com.amazonaws.auth does not exist /db/config/DynamoDBConfig.java:7:29 java: package com.amazonaws.regions does not exist /db/config/DynamoDBConfig.java:8:41 java: package com.amazonaws.services.dynamodbv2 does not exist /db/config/DynamoDBConfig.java:9:41 java: package com.amazonaws.services.dynamodbv2 does not exist /db/config/DynamoDBConfig.java:10:54 java: package com.amazonaws.services.dynamodbv2.datamodeling does not exist /db/config/DynamoDBConfig.java:11:54 java: package com.amazonaws.services.dynamodbv2.datamodeling does not exist /db/config/DynamoDBConfig.java:12:63 java: package org.socialsignin.spring.data.dynamodb.repository.config does not exist /db/config/DynamoDBConfig.java:18:2 java: cannot find symbol symbol: class EnableDynamoDBRepositories /db/config/DynamoDBConfig.java:26:12 java: cannot find symbol symbol: class AWSCredentialsProvider location: class com.comcast.xvp.rights.db.config.DynamoDBConfig /db/config/DynamoDBConfig.java:31:12 java: cannot find symbol symbol: class AWSCredentials location: class com.comcast.xvp.rights.db.config.DynamoDBConfig /db/config/DynamoDBConfig.java:36:12 java: cannot find symbol symbol: class DynamoDBMapperConfig location: class com.comcast.xvp.rights.db.config.DynamoDBConfig /db/config/DynamoDBConfig.java:41:42 java: cannot find symbol symbol: class AmazonDynamoDB location: class com.comcast.xvp.rights.db.config.DynamoDBConfig /db/config/DynamoDBConfig.java:41:73 java: cannot find symbol symbol: class DynamoDBMapperConfig location: class com.comcast.xvp.rights.db.config.DynamoDBConfig /db/config/DynamoDBConfig.java:41:12 java: cannot find symbol symbol: class DynamoDBMapper location: class com.comcast.xvp.rights.db.config.DynamoDBConfig /db/config/DynamoDBConfig.java:46:12 java: cannot find symbol symbol: class AmazonDynamoDB location: class com.comcast.xvp.rights.db.config.DynamoDBConfig
and enable to get these annotations to compile
import org.socialsignin.spring.data.dynamodb.repository.EnableScan
import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories;

Specifications

  • Spring Data DynamoDB Version: 'io.github.boostchicken', name: 'spring-data-dynamodb', version: '5.2.5'
  • Spring Data Version: spring.data 2.4.3
  • AWS SDK Version: 'com.amazonaws', name: 'aws-java-sdk-dynamodb', version: '1.11.844'
  • Java Version: 15
  • Platform Details: Spring boot 2.4.3

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Reference issue derjust#267
@boostchicken

transactions not supported by default

Hey,
I'm using the latest version of your project (5.2.5), and noticed that there is no support in transactions by default.
This is crucial for our project. is there something else we need to config ,or it is not supported at all?
Thanks.

Multiple methods annotated by @DynamoDBRangeKey

I was trying out spring-data-dynamodb Implementation with @DynamoDbHashKey & @DynamoDBRangeKey in the format which is specified at https://medium.com/@leohoc/dynamodb-and-spring-data-a81c546a1305

But the application is failing on startup with the error:

Multiple methods annotated by @DynamoDBRangeKey within type com.service.EntityClass!
        at org.springframework.util.Assert.isNull(Assert.java:162)
        at org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBHashAndRangeKeyMethodExtractorImpl$3.doWith(DynamoDBHashAndRangeKeyMethodExtractorImpl.java:79)
        at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:364)
        at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:343)
        at org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBHashAndRangeKeyMethodExtractorImpl.<init>(DynamoDBHashAndRangeKeyMethodExtractorImpl.java:75)
        at org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBHashAndRangeKeyExtractingEntityMetadataImpl.<init>(DynamoDBHashAndRangeKeyExtractingEntityMetadataImpl.java:45)
        at org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityMetadataSupport.getEntityInformation(DynamoDBEntityMetadataSupport.java:123)
        at org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory.getEntityInformation(DynamoDBRepositoryFactory.java:104)
        at org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory.getDynamoDBRepository(DynamoDBRepositoryFactory.java:128)
        at org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory.getTargetRepository(DynamoDBRepositoryFactory.java:150)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:310)
        at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:297)
        at org.springframework.data.util.Lazy.getNullable(Lazy.java:211)
        at org.springframework.data.util.Lazy.get(Lazy.java:95)

Specifications

  • Spring Data DynamoDB Version: 5.2.5 (2.2)
  • Spring Data Version: 2.3.6.RELEASE
  • AWS SDK Version: 1.11.943
  • Java Version: 1.8.0_282 - OpenJDK 64-Bit Server VM 25.282-b08
  • Platform Details: Linux 3.10.0-1160.49.1.el7.x86_64

Unable to get by GSI with dynamodb-local

Expected Behavior

When using DynamoLocal for development a call to getByGsi GSI HashKey returns a List of Items

Actual Behavior

After I moved from derjust/spring-data-dymanodb to this one I get the following error:

com.amazonaws.services.dynamodbv2.model.ResourceNotFoundException: Cannot do operations on a non-existent table (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ResourceNotFoundException

Steps to Reproduce the Problem

  1. The model has a composite key and GSI (hash key only)
  2. Repository with two methods one to find by (PK and SK) the second one to getByGsi (global secondary index)
  3. Call using an instance of the repository using the getByGsi method

Specifications

  • Spring Data DynamoDB Version: 5.2.5
  • Spring Data Version: 2.3.2-RELEASE
  • AWS SDK Version: 1.11.839
  • Java Version: java 11.0.6 2020-01-14 LTS
  • Platform Details: Mac OSX 10.15.6

Starting dynamodb-local like this:

docker run -d -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -inMemory -sharedDb                                       

Table name override does not work for find operations

Expected Behavior

Table name override does not work for find by id and i get resource not found exception from dynamodb

DynamoDBMapperConfig .Builder() .withTableNameOverride(tableNameOverrider) .withTypeConverterFactory(DynamoDBTypeConverterFactory.standard()) .build()

Actual Behavior

Steps to Reproduce the Problem

Specifications

  • Spring Data DynamoDB Version:
  • Spring Data Version:
  • AWS SDK Version:
  • Java Version:
  • Platform Details:

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Failed to register dynamoDBMapperRef

In my project, I need to specify dynamoDBMapperRef field in @EnableDynamoDBRepositories and I just realize it doesn't working as expected.

Expected Behavior

My project will be starting just fine and my repo will be using the registered dynamoDBMapperRef

Actual Behavior

My project failed to start and exception as below :

java.lang.IllegalArgumentException: 'beanName' must not be empty
	at org.springframework.util.Assert.hasText(Assert.java:284) ~[spring-core-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at org.springframework.beans.factory.config.RuntimeBeanReference.<init>(RuntimeBeanReference.java:61) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at org.springframework.beans.factory.config.RuntimeBeanReference.<init>(RuntimeBeanReference.java:50) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at org.springframework.beans.factory.support.BeanDefinitionBuilder.addConstructorArgReference(BeanDefinitionBuilder.java:209) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at org.socialsignin.spring.data.dynamodb.repository.config.DynamoDBRepositoryConfigExtension.lambda$postProcess$0(DynamoDBRepositoryConfigExtension.java:158) ~[spring-data-dynamodb-5.2.3.jar:5.2.3]
	at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1133) ~[na:na]
	at org.socialsignin.spring.data.dynamodb.repository.config.DynamoDBRepositoryConfigExtension.postProcess(DynamoDBRepositoryConfigExtension.java:152) ~[spring-data-dynamodb-5.2.3.jar:5.2.3]
	at org.socialsignin.spring.data.dynamodb.repository.config.DynamoDBRepositoryConfigExtension.postProcess(DynamoDBRepositoryConfigExtension.java:95) ~[spring-data-dynamodb-5.2.3.jar:5.2.3]
	at org.springframework.data.repository.config.RepositoryConfigurationDelegate.registerRepositoriesIn(RepositoryConfigurationDelegate.java:163) ~[spring-data-commons-2.3.0.RELEASE.jar:2.3.0.RELEASE]
	at org.springframework.data.repository.config.RepositoryBeanDefinitionRegistrarSupport.registerBeanDefinitions(RepositoryBeanDefinitionRegistrarSupport.java:107) ~[spring-data-commons-2.3.0.RELEASE.jar:2.3.0.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:384) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) ~[na:na]
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:383) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:148) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:706) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE]
	at com.example.springddb.SpringDdbApplication.main(SpringDdbApplication.java:10) ~[classes/:na]


Process finished with exit code 1

Steps to Reproduce the Problem

It is actually quite simple to reproduce
I just need to create simple project, then specify dynamoDBMapperRef field in @EnableDynamoDBRepositories

@Configuration
@EnableDynamoDBRepositories(dynamoDBMapperRef = "dynamoDBMapper", basePackages = "com.example.xxxx")
public class DynamoDBConfig {
...............

Specifications

Spring Data DynamoDB Version: 5.2.3 (2.2)
Spring Data Version: 2.3.0.RELEASE
AWS SDK Version: 1.11.664
Java Version: 11.0.5 - Java HotSpot(TM) 64-Bit Server VM 11.0.5+10-LTS
Platform Details: Mac OS X 10.15.2

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Suport to Spring 6

Hello, is there an intention to adapt this excellent framework to the latest version of Spring 6 with AOT?

Fails to compile with Spring Boot 2.3.0 [kotlin]

Expected Behavior

Application is starting

Actual Behavior

Using this lib with Spring Boot 2.2.7 works right, however when I wanted to upgrade to 2.3.0 the application compilation fails with error:

Cause: org/jetbrains/kotlin/daemon/common/IncrementalModuleEntry

I had the same error when using the version from where this repo is forked together with Spring 2.2. I saw the CHANGELOG says it should work with Spring 2.3 but it's not for me.

Specifications

  • Spring Data DynamoDB Version: 5.2.4
  • Spring Data Version: 2.3.0
  • AWS SDK Version: 1.11.608 (tried 1.11.793 with no luck)
  • Java Version: 11.0.5
  • Kotlin Version: 1.3.41
  • Platform Details: macOS Catalina 10.15.4

Allow single object as parameter to query a set/list

My entity contains a field of type Set countries (stringSet). I want to query against it with one country.

Expected Behavior

Iterable<ProductEntity> findAllByCountriesContainsOrCountriesContains(String country) returns a list of products, that contains country their countries fields.

Actual Behavior

java.lang.ClassCastException: class java.lang.String cannot be cast to class java.util.Collection (java.lang.String and java.util.Collection are in module java.base of loader 'bootstrap')
	at com.amazonaws.services.dynamodbv2.datamodeling.StandardTypeConverters$Vector$ToSet$1.convert(StandardTypeConverters.java:449) ~[aws-java-sdk-dynamodb-1.11.415.jar:na]
	at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverter$DelegateConverter.convert(DynamoDBTypeConverter.java:104) ~[aws-java-sdk-dynamodb-1.11.415.jar:na]
	at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverter$NullSafeConverter.convert(DynamoDBTypeConverter.java:123) ~[aws-java-sdk-dynamodb-1.11.415.jar:na]
	at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverter$ExtendedConverter.convert(DynamoDBTypeConverter.java:83) ~[aws-java-sdk-dynamodb-1.11.415.jar:na]
	at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperFieldModel.convert(DynamoDBMapperFieldModel.java:138) ~[aws-java-sdk-dynamodb-1.11.415.jar:na]
	at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCriteria.getPropertyAttributeValue(AbstractDynamoDBQueryCriteria.java:557) ~[spring-data-dynamodb-5.2.4.jar:5.2.4]
	at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCriteria.createSingleValueCondition(AbstractDynamoDBQueryCriteria.java:706) ~[spring-data-dynamodb-5.2.4.jar:5.2.4]
	at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCriteria.withSingleValueCriteria(AbstractDynamoDBQueryCriteria.java:485) ~[spring-data-dynamodb-5.2.4.jar:5.2.4]
	at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCreator.addCriteria(AbstractDynamoDBQueryCreator.java:151) ~[spring-data-dynamodb-5.2.4.jar:5.2.4]
	at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCreator.create(AbstractDynamoDBQueryCreator.java:123) ~[spring-data-dynamodb-5.2.4.jar:5.2.4]
	at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCreator.create(AbstractDynamoDBQueryCreator.java:49) ~[spring-data-dynamodb-5.2.4.jar:5.2.4]

Specifications

  • Spring Data DynamoDB Version: 5.2.4 (2.2)
  • Spring Data Version: 2.3.1.RELEASE
  • AWS SDK Version: 1.11.415
  • Java Version: 11.0.2 - OpenJDK 64-Bit Server VM 11.0.2+9
  • Platform Details: Mac OS X 10.15.4

Is this project still alive?

Both Spring 6 and Spring Boot 3 have been published in November, so I'd expect some activity here. However, the last commit is roughly a year ago and the last publish to Maven Central is two and a half years old. Is this repository still alive? Are you going to continue your great work?

Best regards,
Stephan

Spring dynamo dB 2.2.5 and Amazon aws 12.136 not working

Expected Behavior

Actual Behavior

Steps to Reproduce the Problem

Specifications

  • Spring Data DynamoDB Version: 5.2.5
  • Spring Data Version: 2.5.8
  • AWS SDK Version: 12.136
  • Java Version: 8
  • Platform Details: windows 10

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

JPA Specification compabilty

Expected Behavior

It ll be great that the library had compability with JpaSpecificationExecutor from JPA framework

Ability to apply filter expressions to Querys

	@Query(fields = "leaveDate", limit = 1, filterExpression = "contains(#field, :value)",
			expressionMappingNames = {@ExpressionAttribute(key = "#field", value = "name")},
			expressionMappingValues = {@ExpressionAttribute(key=":value", value = "projection")})

This allows people the ability to use filter expressions

Implement DynamoDB Auto Increment and Atomic Counter Annotations

Requesting an enhancement for Dynamo DB Data Repository given variable annotated with @DynamoDBHashKey, would like to see an annotation that is @DynamoDBAutoIncrement on an integer variable where multiple instances of the same @DynamoDBHashKey can be available.

Expected Behavior

This is different use case from updating an item, rather the data pattern of putting the same item key with incremented values on a attribute, i.e. same object but different versioning (Although @DynamoDBAtomicCounter which could be another good add for an annotation as well
see: https://linuxacademy.com/blog/linux-academy/dynamodb-atomic-counters/).

e.g.
Suppose there's a customer with orders that earn points when purchasing x item and there's multiple order numbers under the same customer hash key, but the history of all points must be kept. This way, we can query the primary key (the customer) and the order number and the total count of orders made in history.

https://stackoverflow.com/questions/38193431/auto-increment-counter-in-dynamo-db

is it possible to determine the dynamodb region in runtime

is it possible to determine the DynamoDB region in runtime?

The requirement is:
We have multiple type environment servers such as dev,QA, etc. and different servers connect to different regions of DynamoDB. but we want to make a single back office to manage all the data on different regions of DynamoDB. So we need to determine the region in runtime, for example, we can switch region by invoking an API.

If use the AWS SDK, it seems like we need to build different AmazonDynamoDBClientBuilder, but is it possible by using this Spring-data-dynamodb achieve like that?

Expected Behavior

Actual Behavior

Steps to Reproduce the Problem

Specifications

  • Spring Data DynamoDB Version:
  • Spring Data Version:
  • AWS SDK Version:
  • Java Version:
  • Platform Details:

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Support disabling consistent read on per @Query

Expected Behavior

We should be able to disable consistent read behaviour on per query basis, instead of having to use a custom repository.
This feature is helpful for queries on GSI as they dont support consistent reads.

Actual Behavior

Either disable it for all using dynamodb mapper config or use custom repositories.

Specifications

  • Spring Data DynamoDB Version: 5.1.0
  • Spring Data Version: 2.2.3.Release
  • AWS SDK Version: 1.11.443
  • Java Version: openjdk version "11.0.5" 2019-10-15
  • Platform Details: Macbook Pro mid-2018

Missing Local index projection settings

Expected Behavior

I would expect to have the option to configure the projection of the local index or at least the default behaviour should project all fields the same way as GSI.

Actual Behavior

If using local indices, there is no projection configuration which makes the index almost useless.

Steps to Reproduce the Problem

  1. Specify localSecondaryIndexName in DynamoDBIndexRangeKey
  2. Execute a find by indexed field.
  3. All fields are empty

Specifications

  • Spring Data DynamoDB Version: 5.2.3
  • Spring Data Version: 2.2.2.RELEASE
  • AWS SDK Version: .11.664
  • Java Version: Java 11
  • Platform Details: Azul Zulu

NotContains is not allowing single parameter as filter

Expected Behavior

NotContains should return list of Acknowledgements when acknowledgements does not contains username.

public List<Acknowledgement> findAllByAcknowledgementsNotContainsAndActiveIsTrue(String username);

where Acknowledgement:

@DynamoDBTable(tableName = "acknowledgement")
@Getter @Setter @NoArgsConstructor
public class Acknowledgement {
	@Id
	@DynamoDBHashKey
	@DynamoDBAutoGeneratedKey
	private String id;

       @Field
       @DynamoDBAttribute
       private List<String> acknowledgements = new ArrayList<>();
...
}

Actual Behavior

java.lang.ClassCastException: class java.lang.String cannot be cast to class java.util.List (java.lang.String and java.util.List are in module java.base of loader 'bootstrap')
    at com.amazonaws.services.dynamodbv2.datamodeling.StandardTypeConverters$Vector$ToList$1.convert(StandardTypeConverters.java:370) ~[aws-java-sdk-dynamodb-1.12.297.jar:na]
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverter$DelegateConverter.convert(DynamoDBTypeConverter.java:104) ~[aws-java-sdk-dynamodb-1.12.297.jar:na]
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverter$NullSafeConverter.convert(DynamoDBTypeConverter.java:123) ~[aws-java-sdk-dynamodb-1.12.297.jar:na]
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverter$ExtendedConverter.convert(DynamoDBTypeConverter.java:83) ~[aws-java-sdk-dynamodb-1.12.297.jar:na]
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperFieldModel.convert(DynamoDBMapperFieldModel.java:138) ~[aws-java-sdk-dynamodb-1.12.297.jar:na]
    at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCriteria.getPropertyAttributeValue(AbstractDynamoDBQueryCriteria.java:564) ~[spring-data-dynamodb-5.2.5.jar:5.2.5]
    at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCriteria.createSingleValueCondition(AbstractDynamoDBQueryCriteria.java:713) ~[spring-data-dynamodb-5.2.5.jar:5.2.5]
    at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCriteria.withSingleValueCriteria(AbstractDynamoDBQueryCriteria.java:485) ~[spring-data-dynamodb-5.2.5.jar:5.2.5]
    at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCreator.getItemsProperty(AbstractDynamoDBQueryCreator.java:206) ~[spring-data-dynamodb-5.2.5.jar:5.2.5]
    at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCreator.addCriteria(AbstractDynamoDBQueryCreator.java:147) ~[spring-data-dynamodb-5.2.5.jar:5.2.5]
    at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCreator.create(AbstractDynamoDBQueryCreator.java:124) ~[spring-data-dynamodb-5.2.5.jar:5.2.5]
    at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQueryCreator.create(AbstractDynamoDBQueryCreator.java:50) ~[spring-data-dynamodb-5.2.5.jar:5.2.5]
    at org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:119) ~[spring-data-commons-2.7.0.jar:2.7.0]
    at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:95) ~[spring-data-commons-2.7.0.jar:2.7.0]
    at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:81) ~[spring-data-commons-2.7.0.jar:2.7.0]
    at org.socialsignin.spring.data.dynamodb.repository.query.PartTreeDynamoDBQuery.doCreateQuery(PartTreeDynamoDBQuery.java:58) ~[spring-data-dynamodb-5.2.5.jar:5.2.5]
    at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQuery.doCreateQueryWithPermissions(AbstractDynamoDBQuery.java:81) ~[spring-data-dynamodb-5.2.5.jar:5.2.5]
    at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQuery$CollectionExecution.execute(AbstractDynamoDBQuery.java:100) ~[spring-data-dynamodb-5.2.5.jar:5.2.5]
    at org.socialsignin.spring.data.dynamodb.repository.query.AbstractDynamoDBQuery.execute(AbstractDynamoDBQuery.java:311) ~[spring-data-dynamodb-5.2.5.jar:5.2.5]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.7.0.jar:2.7.0]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.7.0.jar:2.7.0]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:159) ~[spring-data-commons-2.7.0.jar:2.7.0]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138) ~[spring-data-commons-2.7.0.jar:2.7.0]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.20.jar:5.3.20]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.20.jar:5.3.20]
    at com.sun.proxy.$Proxy160.findAllByAcknowledgementsNotContainsAndActiveIsTrue(Unknown Source) ~[na:na]

Steps to Reproduce the Problem

  1. Execute above code

Specifications

  • Spring Data DynamoDB Version: 5.2.5
  • Spring Data Version: Neumann-SR9 (spring-data-commons-2.7.0.jar)
  • AWS SDK Version: 1.12.297
  • Java Version: OpenJDK 64-Bit Server VM Corretto-11.0.16.9.1 (build 11.0.16.1+9-LTS, mixed mode)
  • Platform Details: Docker CE on Ubuntu 22.04

All those information are logged by org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory on INFO level on startup.
Or use java -version and mvn dependency:tree | grep -E 'spring|aws' to provide those version numbers.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.