diff --git a/pom.xml b/pom.xml
index 602792117..d578d5011 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,6 +18,7 @@
1.9.7
+ 2.2.2
0.6.0.BUILD-SNAPSHOT
DATACMNS
@@ -69,6 +70,12 @@
${jackson}
true
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson2}
+ true
+
org.springframework
spring-web
diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryNameSpaceHandler.java b/src/main/java/org/springframework/data/repository/config/RepositoryNameSpaceHandler.java
index 7c314088d..b4603416a 100644
--- a/src/main/java/org/springframework/data/repository/config/RepositoryNameSpaceHandler.java
+++ b/src/main/java/org/springframework/data/repository/config/RepositoryNameSpaceHandler.java
@@ -36,5 +36,6 @@ public class RepositoryNameSpaceHandler extends NamespaceHandlerSupport {
public void init() {
registerBeanDefinitionParser("unmarshaller-populator", PARSER);
registerBeanDefinitionParser("jackson-populator", PARSER);
+ registerBeanDefinitionParser("jackson2-populator", PARSER);
}
}
diff --git a/src/main/java/org/springframework/data/repository/config/ResourceReaderRepositoryPopulatorBeanDefinitionParser.java b/src/main/java/org/springframework/data/repository/config/ResourceReaderRepositoryPopulatorBeanDefinitionParser.java
index 598790c1b..b2f32e358 100644
--- a/src/main/java/org/springframework/data/repository/config/ResourceReaderRepositoryPopulatorBeanDefinitionParser.java
+++ b/src/main/java/org/springframework/data/repository/config/ResourceReaderRepositoryPopulatorBeanDefinitionParser.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2012 the original author or authors.
+ * Copyright 2012-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,9 +15,12 @@
*/
package org.springframework.data.repository.config;
+import java.util.Arrays;
+
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
+import org.springframework.data.repository.init.Jackson2RepositoryPopulatorFactoryBean;
import org.springframework.data.repository.init.JacksonRepositoryPopulatorFactoryBean;
import org.springframework.data.repository.init.UnmarshallerRepositoryPopulatorFactoryBean;
import org.springframework.util.StringUtils;
@@ -38,8 +41,16 @@ public class ResourceReaderRepositoryPopulatorBeanDefinitionParser extends Abstr
protected String getBeanClassName(Element element) {
String name = element.getLocalName();
- return "unmarshaller-populator".equals(name) ? UnmarshallerRepositoryPopulatorFactoryBean.class.getName()
- : JacksonRepositoryPopulatorFactoryBean.class.getName();
+
+ if ("unmarshaller-populator".equals(name)) {
+ return UnmarshallerRepositoryPopulatorFactoryBean.class.getName();
+ } else if ("jackson-populator".equals(name)) {
+ return JacksonRepositoryPopulatorFactoryBean.class.getName();
+ } else if ("jackson2-populator".equals(name)) {
+ return Jackson2RepositoryPopulatorFactoryBean.class.getName();
+ }
+
+ throw new IllegalStateException("Unsupported populator type " + name + "!");
}
/*
@@ -55,7 +66,7 @@ public class ResourceReaderRepositoryPopulatorBeanDefinitionParser extends Abstr
if ("unmarshaller-populator".equals(localName)) {
parseXmlPopulator(element, builder);
- } else if ("jackson-populator".equals(localName)) {
+ } else if (Arrays.asList("jackson-populator", "jackson2-populator").contains(localName)) {
parseJsonPopulator(element, builder);
}
}
@@ -66,7 +77,7 @@ public class ResourceReaderRepositoryPopulatorBeanDefinitionParser extends Abstr
* @param element
* @param builder
*/
- private void parseJsonPopulator(Element element, BeanDefinitionBuilder builder) {
+ private static void parseJsonPopulator(Element element, BeanDefinitionBuilder builder) {
String objectMapperRef = element.getAttribute("object-mapper-ref");
@@ -81,7 +92,7 @@ public class ResourceReaderRepositoryPopulatorBeanDefinitionParser extends Abstr
* @param element
* @param builder
*/
- private void parseXmlPopulator(Element element, BeanDefinitionBuilder builder) {
+ private static void parseXmlPopulator(Element element, BeanDefinitionBuilder builder) {
String unmarshallerRefName = element.getAttribute("unmarshaller-ref");
diff --git a/src/main/java/org/springframework/data/repository/init/Jackson2RepositoryPopulatorFactoryBean.java b/src/main/java/org/springframework/data/repository/init/Jackson2RepositoryPopulatorFactoryBean.java
new file mode 100644
index 000000000..96eb8c112
--- /dev/null
+++ b/src/main/java/org/springframework/data/repository/init/Jackson2RepositoryPopulatorFactoryBean.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2013 the original author or authors.
+ *
+ * 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.springframework.data.repository.init;
+
+import org.springframework.beans.factory.FactoryBean;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * {@link FactoryBean} to set up a {@link ResourceReaderRepositoryPopulator} with a {@link Jackson2ResourceReader}.
+ *
+ * @author Oliver Gierke
+ * @since 1.6
+ */
+public class Jackson2RepositoryPopulatorFactoryBean extends AbstractRepositoryPopulatorFactoryBean {
+
+ private ObjectMapper mapper;
+
+ /**
+ * Configures the {@link ObjectMapper} to be used.
+ *
+ * @param mapper
+ */
+ public void setMapper(ObjectMapper mapper) {
+ this.mapper = mapper;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.repository.init.AbstractRepositoryPopulatorFactoryBean#getResourceReader()
+ */
+ @Override
+ protected ResourceReader getResourceReader() {
+ return new Jackson2ResourceReader(mapper);
+ }
+}
diff --git a/src/main/java/org/springframework/data/repository/init/Jackson2ResourceReader.java b/src/main/java/org/springframework/data/repository/init/Jackson2ResourceReader.java
new file mode 100644
index 000000000..b47756af6
--- /dev/null
+++ b/src/main/java/org/springframework/data/repository/init/Jackson2ResourceReader.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2013 the original author or authors.
+ *
+ * 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.springframework.data.repository.init;
+
+import static com.fasterxml.jackson.databind.DeserializationFeature.*;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.springframework.core.io.Resource;
+import org.springframework.util.ClassUtils;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * A {@link ResourceReader} using Jackson to read JSON into objects.
+ *
+ * @author Oliver Gierke
+ * @since 1.6
+ */
+public class Jackson2ResourceReader implements ResourceReader {
+
+ private static final String DEFAULT_TYPE_KEY = "_class";
+ private static final ObjectMapper DEFAULT_MAPPER = new ObjectMapper();
+
+ static {
+ DEFAULT_MAPPER.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
+ }
+
+ private final ObjectMapper mapper;
+ private String typeKey = DEFAULT_TYPE_KEY;
+
+ /**
+ * Creates a new {@link Jackson2ResourceReader}.
+ */
+ public Jackson2ResourceReader() {
+ this(DEFAULT_MAPPER);
+ }
+
+ /**
+ * Creates a new {@link Jackson2ResourceReader} using the given {@link ObjectMapper}.
+ *
+ * @param mapper
+ */
+ public Jackson2ResourceReader(ObjectMapper mapper) {
+ this.mapper = mapper == null ? DEFAULT_MAPPER : mapper;
+ }
+
+ /**
+ * Configures the JSON document's key to lookup the type to instantiate the object. Defaults to
+ * {@link Jackson2ResourceReader#DEFAULT_TYPE_KEY}.
+ *
+ * @param typeKey
+ */
+ public void setTypeKey(String typeKey) {
+ this.typeKey = typeKey;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.repository.init.ResourceReader#readFrom(org.springframework.core.io.Resource, java.lang.ClassLoader)
+ */
+ public Object readFrom(Resource resource, ClassLoader classLoader) throws Exception {
+
+ InputStream stream = resource.getInputStream();
+ JsonNode node = mapper.reader(JsonNode.class).readTree(stream);
+
+ if (node.isArray()) {
+
+ Iterator elements = node.elements();
+ List