diff --git a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/cdi/DynamoDBRepositoryBean.java b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/cdi/DynamoDBRepositoryBean.java index bc31d521..9054d11e 100644 --- a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/cdi/DynamoDBRepositoryBean.java +++ b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/cdi/DynamoDBRepositoryBean.java @@ -46,6 +46,8 @@ class DynamoDBRepositoryBean extends CdiRepositoryBean { private final Bean dynamoDBOperationsBean; + private final Bean dynamoDBMapperBean; + /** * Constructs a {@link DynamoDBRepositoryBean}. * @@ -62,7 +64,7 @@ class DynamoDBRepositoryBean extends CdiRepositoryBean { */ DynamoDBRepositoryBean(BeanManager beanManager, Bean amazonDynamoDBBean, Bean dynamoDBMapperConfigBean, Bean dynamoDBOperationsBean, - Set qualifiers, Class repositoryType) { + Bean dynamoDBMapperBean, Set qualifiers, Class repositoryType) { super(qualifiers, repositoryType, beanManager); if (dynamoDBOperationsBean == null) { @@ -77,6 +79,7 @@ class DynamoDBRepositoryBean extends CdiRepositoryBean { this.amazonDynamoDBBean = amazonDynamoDBBean; this.dynamoDBMapperConfigBean = dynamoDBMapperConfigBean; this.dynamoDBOperationsBean = dynamoDBOperationsBean; + this.dynamoDBMapperBean = dynamoDBMapperBean; } /* @@ -97,6 +100,10 @@ protected T create(CreationalContext creationalContext, Class repositoryTy ? null : getDependencyInstance(dynamoDBMapperConfigBean, DynamoDBMapperConfig.class); + DynamoDBMapper dynamoDBMapper = dynamoDBMapperBean == null + ? null + : getDependencyInstance(dynamoDBMapperBean, DynamoDBMapper.class); + DynamoDBOperations dynamoDBOperations = dynamoDBOperationsBean == null ? null : getDependencyInstance(dynamoDBOperationsBean, DynamoDBOperations.class); @@ -104,8 +111,9 @@ protected T create(CreationalContext creationalContext, Class repositoryTy if (dynamoDBMapperConfig == null) { dynamoDBMapperConfig = DynamoDBMapperConfig.DEFAULT; } - DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(amazonDynamoDB, dynamoDBMapperConfig); - + if(dynamoDBMapper == null) { + dynamoDBMapper = new DynamoDBMapper(amazonDynamoDB, dynamoDBMapperConfig); + } if (dynamoDBOperations == null) { dynamoDBOperations = new DynamoDBTemplate(amazonDynamoDB, dynamoDBMapper, dynamoDBMapperConfig); } diff --git a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/cdi/DynamoDBRepositoryExtension.java b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/cdi/DynamoDBRepositoryExtension.java index 04dde357..55f6775a 100644 --- a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/cdi/DynamoDBRepositoryExtension.java +++ b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/cdi/DynamoDBRepositoryExtension.java @@ -17,6 +17,7 @@ import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,6 +55,7 @@ public class DynamoDBRepositoryExtension extends CdiRepositoryExtensionSupport { private final Map, Bean> dbMapperConfigs = new HashMap, Bean>(); + private final Map, Bean> dbMapper = new HashMap<>(); public DynamoDBRepositoryExtension() { LOGGER.info("Activating CDI extension for Spring Data DynamoDB repositories."); } @@ -89,6 +91,14 @@ void processBean(@Observes ProcessBean processBean) { dbMapperConfigs.put(qualifiers, (Bean) bean); } } + if (type instanceof Class && DynamoDBMapper.class.isAssignableFrom((Class) type)) { + Set qualifiers = new HashSet(bean.getQualifiers()); + if (bean.isAlternative() || !dbMapper.containsKey(qualifiers)) { + LOGGER.debug("Discovered '{}' with qualifiers {}.", DynamoDBMapper.class.getName(), + qualifiers); + dbMapper.put(qualifiers, (Bean) bean); + } + } } } @@ -138,16 +148,17 @@ private Bean createRepositoryBean(Class repositoryType, Set dynamoDBMapperConfigBean = dbMapperConfigs.get(qualifiers); + Bean dynamoDBOperationsBean = dynamoDBOperationss.get(qualifiers); if (amazonDynamoDBBean == null) { throw new UnsatisfiedResolutionException( String.format("Unable to resolve a bean for '%s' with qualifiers %s.", AmazonDynamoDBClient.class.getName(), qualifiers)); } - Bean dynamoDBOperationsBean = dynamoDBOperationss.get(qualifiers); + Bean dynamoDBMapperBean = dbMapper.get(qualifiers); // Construct and return the repository bean. return new DynamoDBRepositoryBean(beanManager, amazonDynamoDBBean, dynamoDBMapperConfigBean, - dynamoDBOperationsBean, qualifiers, repositoryType); + dynamoDBOperationsBean, dynamoDBMapperBean, qualifiers, repositoryType); } } diff --git a/src/test/java/org/socialsignin/spring/data/dynamodb/repository/cdi/DynamoDBRepositoryBeanTest.java b/src/test/java/org/socialsignin/spring/data/dynamodb/repository/cdi/DynamoDBRepositoryBeanTest.java index e8aa2f96..c8d2e2fd 100644 --- a/src/test/java/org/socialsignin/spring/data/dynamodb/repository/cdi/DynamoDBRepositoryBeanTest.java +++ b/src/test/java/org/socialsignin/spring/data/dynamodb/repository/cdi/DynamoDBRepositoryBeanTest.java @@ -16,6 +16,7 @@ package org.socialsignin.spring.data.dynamodb.repository.cdi; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig; import org.junit.Before; import org.junit.Rule; @@ -62,6 +63,8 @@ interface SampleRepository extends Repository { @Mock private Bean dynamoDBOperationsBean; + @Mock + private Bean dynamoDBMapperBean; private Set qualifiers = Collections.emptySet(); private Class repositoryType = SampleRepository.class; @@ -75,7 +78,7 @@ public void setUp() { @Test public void testNullOperationsOk() { DynamoDBRepositoryBean underTest = new DynamoDBRepositoryBean<>(beanManager, - amazonDynamoDBBean, dynamoDBMapperConfigBean, null, qualifiers, repositoryType); + amazonDynamoDBBean, dynamoDBMapperConfigBean, null, dynamoDBMapperBean, qualifiers, repositoryType); assertNotNull(underTest); } @@ -84,13 +87,13 @@ public void testNullOperationsOk() { public void testNullOperationFail() { expectedException.expectMessage("amazonDynamoDBBean must not be null!"); - new DynamoDBRepositoryBean<>(beanManager, null, dynamoDBMapperConfigBean, null, qualifiers, repositoryType); + new DynamoDBRepositoryBean<>(beanManager, null, dynamoDBMapperConfigBean, null, null, qualifiers, repositoryType); } @Test public void testSetOperationOk1() { DynamoDBRepositoryBean underTest = new DynamoDBRepositoryBean<>(beanManager, null, null, - dynamoDBOperationsBean, qualifiers, repositoryType); + dynamoDBOperationsBean, dynamoDBMapperBean, qualifiers, repositoryType); assertNotNull(underTest); } @@ -100,7 +103,7 @@ public void testSetOperationFail1() { expectedException.expectMessage( "Cannot specify both dynamoDBMapperConfigBean bean and dynamoDBOperationsBean in repository configuration"); - new DynamoDBRepositoryBean<>(beanManager, null, dynamoDBMapperConfigBean, dynamoDBOperationsBean, qualifiers, + new DynamoDBRepositoryBean<>(beanManager, null, dynamoDBMapperConfigBean, dynamoDBOperationsBean, dynamoDBMapperBean, qualifiers, repositoryType); } @@ -109,14 +112,14 @@ public void testSetOperationFail2() { expectedException.expectMessage( "Cannot specify both amazonDynamoDB bean and dynamoDBOperationsBean in repository configuration"); - new DynamoDBRepositoryBean<>(beanManager, amazonDynamoDBBean, null, dynamoDBOperationsBean, qualifiers, + new DynamoDBRepositoryBean<>(beanManager, amazonDynamoDBBean, null, dynamoDBOperationsBean, dynamoDBMapperBean, qualifiers, repositoryType); } @Test public void testCreateRepostiory() { DynamoDBRepositoryBean underTest = new DynamoDBRepositoryBean<>(beanManager, - amazonDynamoDBBean, dynamoDBMapperConfigBean, null, qualifiers, repositoryType); + amazonDynamoDBBean, dynamoDBMapperConfigBean, null, dynamoDBMapperBean, qualifiers, repositoryType); SampleRepository actual = underTest.create(repoCreationalContext, SampleRepository.class, Optional.empty());