diff --git a/pom.xml b/pom.xml
old mode 100755
new mode 100644
index 9c813de8..7464334d
--- a/pom.xml
+++ b/pom.xml
@@ -40,9 +40,9 @@
5.1.2.RELEASE
2.1.2.RELEASE
- 6.0.9.Final
- 1.11.443
- 4.12
+ 6.1.0.Final
+ 1.11.515
+ 4.13.1
2.23.0
1.2
1.2.0
@@ -252,7 +252,7 @@
maven-surefire-plugin
- 2.20.1
+ 2.21.0
maven-jar-plugin
@@ -362,7 +362,7 @@
org.jacoco
jacoco-maven-plugin
- 0.7.9
+ 0.8.3
@@ -438,7 +438,7 @@
com.github.spotbugs
spotbugs-maven-plugin
- 3.1.5
+ 3.1.11
Max
diff --git a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/config/DynamoDBMapperFactory.java b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/config/DynamoDBMapperFactory.java
index 20486acc..8cb5e801 100644
--- a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/config/DynamoDBMapperFactory.java
+++ b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/config/DynamoDBMapperFactory.java
@@ -15,22 +15,23 @@
*/
package org.socialsignin.spring.data.dynamodb.repository.config;
-import org.springframework.beans.factory.FactoryBean;
-import org.springframework.beans.factory.annotation.Autowired;
-
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.beans.factory.annotation.Autowired;
public class DynamoDBMapperFactory implements FactoryBean {
- private final AmazonDynamoDB amazonDynamoDB;
- private final DynamoDBMapperConfig dynamoDBMapperConfig;
+ // fix issue #230
+ @Autowired
+ private AmazonDynamoDB amazonDynamoDB;
+ // fix issue #230
@Autowired
- public DynamoDBMapperFactory(AmazonDynamoDB amazonDynamoDB, DynamoDBMapperConfig dynamoDBMapperConfig) {
- this.amazonDynamoDB = amazonDynamoDB;
- this.dynamoDBMapperConfig = dynamoDBMapperConfig;
+ private DynamoDBMapperConfig dynamoDBMapperConfig;
+
+ public DynamoDBMapperFactory() {
}
@Override
@@ -42,5 +43,4 @@ public DynamoDBMapper getObject() throws Exception {
public Class> getObjectType() {
return DynamoDBMapper.class;
}
-
}
diff --git a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/config/DynamoDBRepositoryConfigExtension.java b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/config/DynamoDBRepositoryConfigExtension.java
index af5fae4b..6b604ece 100644
--- a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/config/DynamoDBRepositoryConfigExtension.java
+++ b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/config/DynamoDBRepositoryConfigExtension.java
@@ -15,9 +15,6 @@
*/
package org.socialsignin.spring.data.dynamodb.repository.config;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.socialsignin.spring.data.dynamodb.core.DynamoDBTemplate;
@@ -37,6 +34,11 @@
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+
/**
* @author Michael Lavelle
* @author Sebastian Just
@@ -57,6 +59,8 @@ public class DynamoDBRepositoryConfigExtension extends RepositoryConfigurationEx
private BeanDefinitionRegistry registry;
private String defaultDynamoDBMappingContext;
+ private String dynamoDBMapperName;
+ private String dynamoDBMapperConfigName;
@Override
public String getRepositoryFactoryBeanClassName() {
@@ -76,7 +80,7 @@ public void postProcess(BeanDefinitionBuilder builder, AnnotationRepositoryConfi
/*
* (non-Javadoc)
- *
+ *
* @see org.springframework.data.repository.config.
* RepositoryConfigurationExtensionSupport
* #postProcess(org.springframework.beans
@@ -99,14 +103,13 @@ public void postProcess(BeanDefinitionBuilder builder, XmlRepositoryConfiguratio
defaultDynamoDBMappingContext = registerDynamoDBMappingContext(registry);
}
dynamoDBMappingContextRef = defaultDynamoDBMappingContext;
-
}
registerAndSetPostProcessingBeans(builder, registry, dynamoDBMappingContextRef);
}
private Map dynamoDBTemplateCache = new HashMap<>();
private void postProcess(BeanDefinitionBuilder builder, String repositoryName, String amazonDynamoDBRef,
- String dynamoDBMapperConfigRef, String dynamoDBOperationsRef, String dynamoDBMappingContextRef) {
+ String dynamoDBMapperConfigRef, String dynamoDBOperationsRef, String dynamoDBMappingContextRef) {
if (StringUtils.hasText(dynamoDBOperationsRef)) {
builder.addPropertyReference("dynamoDBOperations", dynamoDBOperationsRef);
@@ -129,7 +132,16 @@ private void postProcess(BeanDefinitionBuilder builder, String repositoryName, S
.computeIfAbsent(getBeanNameWithModulePrefix("DynamoDBTemplate-" + dynamoDBRef), ref -> {
BeanDefinitionBuilder dynamoDBTemplateBuilder = BeanDefinitionBuilder
.genericBeanDefinition(DynamoDBTemplate.class);
+ // AmazonDynamoDB amazonDynamoDB, DynamoDBMapper dynamoDBMapper,
+ // DynamoDBMapperConfig dynamoDBMapperConfig
dynamoDBTemplateBuilder.addConstructorArgReference(dynamoDBRef);
+ dynamoDBTemplateBuilder.addConstructorArgReference(this.dynamoDBMapperName);
+
+ if (StringUtils.hasText(dynamoDBMapperConfigRef)) {
+ dynamoDBTemplateBuilder.addConstructorArgReference(dynamoDBMapperConfigRef);
+ } else {
+ dynamoDBTemplateBuilder.addConstructorArgReference(this.dynamoDBMapperConfigName);
+ }
registry.registerBeanDefinition(ref, dynamoDBTemplateBuilder.getBeanDefinition());
return ref;
@@ -137,10 +149,6 @@ private void postProcess(BeanDefinitionBuilder builder, String repositoryName, S
}
builder.addPropertyReference("dynamoDBOperations", dynamoDBOperationsRef);
-
- if (StringUtils.hasText(dynamoDBMapperConfigRef)) {
- builder.addPropertyReference("dynamoDBMapperConfig", dynamoDBMapperConfigRef);
- }
}
if (!StringUtils.hasText(dynamoDBMappingContextRef)) {
@@ -149,7 +157,6 @@ private void postProcess(BeanDefinitionBuilder builder, String repositoryName, S
defaultDynamoDBMappingContext = registerDynamoDBMappingContext(registry);
}
dynamoDBMappingContextRef = defaultDynamoDBMappingContext;
-
}
builder.addPropertyReference("dynamoDBMappingContext", dynamoDBMappingContextRef);
@@ -157,7 +164,7 @@ private void postProcess(BeanDefinitionBuilder builder, String repositoryName, S
}
protected void registerAndSetPostProcessingBeans(BeanDefinitionBuilder builder, BeanDefinitionRegistry registry,
- String dynamoDBMappingContextRef) {
+ String dynamoDBMappingContextRef) {
String tableSynchronizerName = registerEntity2DynamoDBTableSynchronizer(registry, dynamoDBMappingContextRef);
builder.addPropertyReference("entity2DynamoDBTableSynchronizer", tableSynchronizerName);
@@ -168,7 +175,7 @@ protected void registerAndSetPostProcessingBeans(BeanDefinitionBuilder builder,
private final Map entity2DynamoDBTableSynchronizerCache = new ConcurrentHashMap<>();
private String registerEntity2DynamoDBTableSynchronizer(BeanDefinitionRegistry registry,
- String dynamoDBMappingContextRef) {
+ String dynamoDBMappingContextRef) {
assert registry != null;
return entity2DynamoDBTableSynchronizerCache.computeIfAbsent(dynamoDBMappingContextRef, ref -> {
@@ -184,8 +191,9 @@ private String registerEntity2DynamoDBTableSynchronizer(BeanDefinitionRegistry r
}
private final Map dynamoDBMappingContextProcessorCache = new ConcurrentHashMap<>();
+
private String registerDynamoDBMappingContextProcessor(BeanDefinitionRegistry registry,
- String dynamoDBMappingContextRef) {
+ String dynamoDBMappingContextRef) {
assert registry != null;
return dynamoDBMappingContextProcessorCache.computeIfAbsent(dynamoDBMappingContextRef, ref -> {
@@ -220,21 +228,25 @@ private String registerDynamoDBMappingContext(BeanDefinitionRegistry registry) {
@Override
public void registerBeansForRoot(BeanDefinitionRegistry registry,
- RepositoryConfigurationSource configurationSource) {
+ RepositoryConfigurationSource configurationSource) {
super.registerBeansForRoot(registry, configurationSource);
// Store for later to be used by #postProcess, too
this.registry = registry;
- BeanDefinitionBuilder dynamoDBMapperConfigBuiilder = BeanDefinitionBuilder
- .genericBeanDefinition(DynamoDBMapperConfigFactory.class);
- registry.registerBeanDefinition(getBeanNameWithModulePrefix("DynamoDBMapperConfig"),
- dynamoDBMapperConfigBuiilder.getBeanDefinition());
+ // Fix issue #233
+ Optional dynamoDBMapperConfigRef = configurationSource.getAttribute("dynamoDBMapperConfigRef");
+ if (!dynamoDBMapperConfigRef.isPresent()) {
+ BeanDefinitionBuilder dynamoDBMapperConfigBuilder = BeanDefinitionBuilder
+ .genericBeanDefinition(DynamoDBMapperConfigFactory.class);
+ registry.registerBeanDefinition(getBeanNameWithModulePrefix("DynamoDBMapperConfig"),
+ dynamoDBMapperConfigBuilder.getBeanDefinition());
+ }
+ this.dynamoDBMapperName = getBeanNameWithModulePrefix("DynamoDBMapper");
BeanDefinitionBuilder dynamoDBMapperBuilder = BeanDefinitionBuilder
.genericBeanDefinition(DynamoDBMapperFactory.class);
- registry.registerBeanDefinition(getBeanNameWithModulePrefix("DynamoDBMapper"),
- dynamoDBMapperBuilder.getBeanDefinition());
+ registry.registerBeanDefinition(this.dynamoDBMapperName, dynamoDBMapperBuilder.getBeanDefinition());
}
protected String getBeanNameWithModulePrefix(String baseBeanName) {
@@ -245,5 +257,4 @@ protected String getBeanNameWithModulePrefix(String baseBeanName) {
protected String getModulePrefix() {
return "dynamoDB";
}
-
}
diff --git a/src/test/java/org/socialsignin/spring/data/dynamodb/repository/config/DynamoDBMapperConfigTest.java b/src/test/java/org/socialsignin/spring/data/dynamodb/repository/config/DynamoDBMapperConfigTest.java
new file mode 100644
index 00000000..2d88bf8f
--- /dev/null
+++ b/src/test/java/org/socialsignin/spring/data/dynamodb/repository/config/DynamoDBMapperConfigTest.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright © 2018 spring-data-dynamodb (https://github.com/derjust/spring-data-dynamodb)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.socialsignin.spring.data.dynamodb.repository.config;
+
+import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.springframework.beans.factory.UnsatisfiedDependencyException;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Test Issue #233 fix
+ */
+public class DynamoDBMapperConfigTest {
+
+ static class BaseTestConfig {
+ @Bean
+ public AmazonDynamoDB amazonDynamoDB() {
+ return Mockito.mock(AmazonDynamoDB.class);
+ }
+
+ @Bean
+ public DynamoDBMapper dynamoDBMapper() {
+ return Mockito.mock(DynamoDBMapper.class);
+ }
+ }
+
+ @Configuration
+ @EnableDynamoDBRepositories(dynamoDBMapperConfigRef = "customDynamoDBMapperConfig")
+ static class TestConfigWithDynamoDBMapperConfigRef extends BaseTestConfig {
+ @Bean("customDynamoDBMapperConfig")
+ public DynamoDBMapperConfig dynamoDBMapperConfig() {
+ return DynamoDBMapperConfig.DEFAULT;
+ }
+ }
+
+ @Configuration
+ @EnableDynamoDBRepositories
+ static class TestConfigWithoutDynamoDBMapperConfigRef extends TestConfigWithDynamoDBMapperConfigRef {
+ }
+
+ @Configuration
+ @EnableDynamoDBRepositories
+ static class TestConfigWithoutDynamoDBMapperConfigBean extends BaseTestConfig {
+ }
+
+ @Test
+ public void testConfigWithDynamoDBMapperConfigRef() {
+ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
+ TestConfigWithDynamoDBMapperConfigRef.class);
+
+ boolean containsBean = ctx.containsBean("customDynamoDBMapperConfig");
+ assertTrue(containsBean);
+ }
+
+ @Test(expected = UnsatisfiedDependencyException.class)
+ public void testConfigWithoutDynamoDBMapperConfigRef() {
+ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
+ TestConfigWithoutDynamoDBMapperConfigRef.class);
+
+ boolean containsBean = ctx.containsBean("customDynamoDBMapperConfig");
+ assertTrue(containsBean);
+ }
+
+ @Test
+ public void testConfigWithoutDynamoDBMapperConfigBean() {
+ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
+ TestConfigWithoutDynamoDBMapperConfigBean.class);
+
+ boolean containsBean = ctx.containsBean("customDynamoDBMapperConfig");
+ assertFalse(containsBean);
+
+ containsBean = ctx.containsBean("dynamoDB-DynamoDBMapperConfig");
+ assertTrue(containsBean);
+ }
+}