From b38266a5b340bc4ea48d6625a0a44efb3e76b728 Mon Sep 17 00:00:00 2001 From: Sebastian J Date: Wed, 10 Oct 2018 01:35:41 -0400 Subject: [PATCH] Issue #119: Fix incorrect `README.md` and updated example project --- README.md | 205 +++++++++++++++++++++++++----------------------------- 1 file changed, 95 insertions(+), 110 deletions(-) diff --git a/README.md b/README.md index 2f62765c..36e9bf73 100644 --- a/README.md +++ b/README.md @@ -43,150 +43,135 @@ Download the JAR though [Maven Central](http://mvnrepository.com/artifact/com.gi Setup DynamoDB configuration as well as enabling Spring-Data DynamoDB repository support via Annotation ([XML-based configuration](wiki/Quick-Start---XML-based-configuration)) +Create a DynamoDB entity [User](https://github.com/derjust/spring-data-dynamodb-examples/blob/master/src/main/java/com/github/derjust/spring_data_dynamodb_examples/simple/User.java) for this table: + ```java -@Configuration -@EnableDynamoDBRepositories(basePackages = "com.acme.repositories") -public class DynamoDBConfig { +@DynamoDBTable(tableName = "User") +public class User { - @Value("${amazon.dynamodb.endpoint}") - private String amazonDynamoDBEndpoint; + private String id; + private String firstName; + private String lastName; - @Value("${amazon.aws.accesskey}") - private String amazonAWSAccessKey; + public User() { + // Default constructor is required by AWS DynamoDB SDK + } - @Value("${amazon.aws.secretkey}") - private String amazonAWSSecretKey; + public User(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } - @Bean - public AmazonDynamoDB amazonDynamoDB(AWSCredentials amazonAWSCredentials) { - AmazonDynamoDB amazonDynamoDB = new AmazonDynamoDBClient(amazonAWSCredentials); + @DynamoDBHashKey + @DynamoDBAutoGeneratedKey + public String getId() { + return id; + } - if (StringUtils.isNotEmpty(amazonDynamoDBEndpoint)) { - amazonDynamoDB.setEndpoint(amazonDynamoDBEndpoint); - } - return amazonDynamoDB; + @DynamoDBAttribute + public String getFirstName() { + return firstName; } - @Bean - public AWSCredentials amazonAWSCredentials() { - // Or use an AWSCredentialsProvider/AWSCredentialsProviderChain - return new BasicAWSCredentials(amazonAWSAccessKey, amazonAWSSecretKey); + @DynamoDBAttribute + public String getLastName() { + return lastName; } + //setter & hashCode & equals } ``` -Create a DynamoDB entity for this table: +Create a CRUD repository interface [UserRepository](https://github.com/derjust/spring-data-dynamodb-examples/blob/master/src/main/java/com/github/derjust/spring_data_dynamodb_examples/simple/UserRepository.java): ```java -@DynamoDBTable(tableName = "User") -public class User { - - private String id; - private String firstName; - private String lastName; - - @DynamoDBHashKey - @DynamoDBAutoGeneratedKey - public String getId() { - return id; - } - - @DynamoDBAttribute - public String getFirstName() { - return firstName; - } - - @DynamoDBAttribute - public String getLastName() { - return lastName; - } - - public void setId(String id) { - this.id = id; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } +@EnableScan +public interface UserRepository extends CrudRepository { + List findByLastName(String lastName); } ``` -Create a CRUD repository interface in `com.acme.repositories`: +or for paging and sorting... ```java -package com.acme.repositories; +public interface PagingUserRepository extends PagingAndSortingRepository { + Page findByLastName(String lastName, Pageable pageable); -@EnableScan -public interface UserRepository extends CrudRepository { - List findByLastName(String lastName); + @EnableScan + @EnableScanCount + Page findAll(Pageable pageable); } ``` -or for paging and sorting... - +Create the configuration class [DynamoDBConfig](https://github.com/derjust/spring-data-dynamodb-examples/blob/master/src/test/java/com/github/derjust/spring_data_dynamodb_examples/simple/UserRepositoryIT.java#L61): ```java -package com.acme.repositories; - -public interface UserRepository extends PagingAndSortingRepository { - Page findByLastName(String lastName,Pageable pageable); - - @EnableScan - @EnableScanCount - Page findAll(Pageable pageable); +@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 +And finally write a test client [UserRepositoryIT](https://github.com/derjust/spring-data-dynamodb-examples/blob/master/src/test/java/com/github/derjust/spring_data_dynamodb_examples/simple/UserRepositoryIT.java): ```java -@RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = { - PropertyPlaceholderAutoConfiguration.class, DynamoDBConfig.class}) - public class UserRepositoryIntegrationTest { - - @Autowired - UserRepository repository; - - @Test - public void sampleTestCase() { - User dave = new User("Dave", "Matthews"); - repository.save(dave); - - User carter = new User("Carter", "Beauford"); - repository.save(carter); - - List result = repository.findByLastName("Matthews"); - Assert.assertThat(result.size(), is(1)); - Assert.assertThat(result, hasItem(dave)); - } - - private static final long CAPACITY = 5L; - - @Autowired - private AmazonDynamoDB amazonDynamoDB; - - @Before - public void init() throws Exception { - // Delete User table in case it exists - amazonDynamoDB.listTables().getTableNames().stream(). - filter(tableName -> tableName.equals(User.TABLE_NAME)).forEach(tableName -> { - amazonDynamoDB.deleteTable(tableName); - }); +@RunWith(SpringRunner.class) +@SpringBootTest(classes = { PropertyPlaceholderAutoConfiguration.class, DynamoDBConfig.class }) +public class UserRepositoryIT { + private static final Logger log = LoggerFactory.getLogger(UserRepositoryIT.class); - //Create User table - amazonDynamoDB.createTable(new DynamoDBMapper(amazonDynamoDB) - .generateCreateTableRequest(User.class) - .withProvisionedThroughput(new ProvisionedThroughput(CAPACITY, CAPACITY))); - } - + @Autowired + private UserRepository repository; + + @Test + public void sampleTestCase() { + User gosling = new User("James", "Gosling"); + repository.save(gosling); + + User hoeller = new User("Juergen", "Hoeller"); + repository.save(hoeller); + + List result = repository.findByLastName("Gosling"); + Assert.assertThat(result.size(), is(1)); + Assert.assertThat(result, hasItem(gosling)); + log.info("Found in table: {}", result.get(0)); + } + + // setup code } ``` +The full source code is available at [spring-data-dynamodb-examples' simple example](https://github.com/derjust/spring-data-dynamodb-examples/blob/master/README-simple.md) ## More More sample code can be found in the [spring-data-dynamodb-examples](https://github.com/derjust/spring-data-dynamodb-examples) project.