Custom repository implementations - derjust/spring-data-dynamodb GitHub Wiki

Overview

Spring-Data provides hooks to add customized methods to a repository bean to allow for any kind of custom handling that can not be achieved via the regular find methods: Custom implementations for Spring Data repositories

spring-data-dynamodb is not different to any other provider - thus here is an example:

Example

1. Create the custom methods

First we need to declare the custom methods that needs to be implemented:

public interface DeviceValueAdditionRepository {

    String fancyCustomMethod();
}

2. Add the custom methods to the repository

Next add the 'custom interface' to the regular interface (the one which is implemented by spring-data-dynamodb magic). Everything that applies to regular DynamoDB repositories is still true & valid here.

@EnableScan
public interface DeviceValueRepository 
       extends CrudRepository<DeviceValue, DeviceValueKey>,
               DeviceValueAdditionRepository {

    List<DeviceValue> findAll();
}

3. Implement the custom methods

As last step the custom methods needs to be implemented. It is important to name the class implementing the custom interface the same as the interface with a Impl suffix

// Most important this class has to be named like the interface with an 'Impl' suffix
// https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.single-repository-behavior
public class DeviceValueRepositoryImpl implements DeviceValueAdditionRepository {

    // Inject everything you want as this is created like a normal bean
    @Autowired
    DynamoDBTemplate dynamoDBTemplate;

    @Override
    public String fancyCustomMethod() {
        // custom code here

        DeviceValue dv = dynamoDBTemplate.load(DeviceValue.class, "42");
        if (dv == null) {
            return "Not found";
        } else {
            return dv.getTag();
        }
    }
}

4. Use it

Afterwards the new, extended repository can be used as any other repository:

@Autowired
private DeviceValueRepository repository;
	
public void callingMethod() {

    // Call a standard method from the repository
    repository.findAll();

    // Call the custom-implemented method 
    repository.fancyCustomMethod();
}

Spring takes care of blending all implementations properly together and exposing everything under the one repository interface.