Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
205 changes: 95 additions & 110 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<User, String> {
List<User> 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<User, String> {
Page<User> findByLastName(String lastName, Pageable pageable);

@EnableScan
public interface UserRepository extends CrudRepository<User, String> {
List<User> findByLastName(String lastName);
@EnableScan
@EnableScanCount
Page<User> 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<User, String> {
Page<User> findByLastName(String lastName,Pageable pageable);

@EnableScan
@EnableScanCount
Page<User> 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<User> 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<User> 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.
Expand Down