diff --git a/core-groovy-2/README.md b/core-groovy-2/README.md
index 9701976142..f60bdb3cbe 100644
--- a/core-groovy-2/README.md
+++ b/core-groovy-2/README.md
@@ -2,4 +2,6 @@
## Relevant articles:
-- [String Matching in Groovy](http://www.baeldung.com/)
\ No newline at end of file
+- [String Matching in Groovy](http://www.baeldung.com/)
+- [Groovy def Keyword]
+
diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml
index eb82f5d2e3..77de9c8fc8 100644
--- a/core-groovy-2/pom.xml
+++ b/core-groovy-2/pom.xml
@@ -14,12 +14,33 @@
+
+ org.codehaus.groovy
+ groovy
+ ${groovy.version}
+
org.codehaus.groovy
groovy-all
${groovy-all.version}
pom
+
+ org.codehaus.groovy
+ groovy-dateutil
+ ${groovy.version}
+
+
+ org.codehaus.groovy
+ groovy-sql
+ ${groovy-sql.version}
+
+
+ org.junit.platform
+ junit-platform-runner
+ ${junit.platform.version}
+ test
+
org.hsqldb
hsqldb
@@ -43,12 +64,39 @@
+ addSources
+ addTestSources
compile
compileTests
+
+ maven-failsafe-plugin
+ ${maven-failsafe-plugin.version}
+
+
+ org.junit.platform
+ junit-platform-surefire-provider
+ ${junit.platform.version}
+
+
+
+
+ junit5
+
+ integration-test
+ verify
+
+
+
+ **/*Test5.java
+
+
+
+
+
maven-surefire-plugin
2.20.1
@@ -71,10 +119,13 @@
+ 1.0.0
+ 2.5.6
2.5.6
+ 2.5.6
2.4.0
- 1.3-groovy-2.5
- 1.6.3
+ 1.1-groovy-2.4
+ 1.6
diff --git a/core-groovy-2/src/test/groovy/com/baeldung/defkeyword/DefUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/defkeyword/DefUnitTest.groovy
new file mode 100644
index 0000000000..310d97d3fd
--- /dev/null
+++ b/core-groovy-2/src/test/groovy/com/baeldung/defkeyword/DefUnitTest.groovy
@@ -0,0 +1,79 @@
+package com.baeldung.defkeyword
+
+import org.codehaus.groovy.runtime.NullObject
+import org.codehaus.groovy.runtime.typehandling.GroovyCastException
+
+import groovy.transform.TypeChecked
+import groovy.transform.TypeCheckingMode
+
+@TypeChecked
+class DefUnitTest extends GroovyTestCase {
+
+ def id
+ def firstName = "Samwell"
+ def listOfCountries = ['USA', 'UK', 'FRANCE', 'INDIA']
+
+ @TypeChecked(TypeCheckingMode.SKIP)
+ def multiply(x, y) {
+ return x*y
+ }
+
+ @TypeChecked(TypeCheckingMode.SKIP)
+ void testDefVariableDeclaration() {
+
+ def list
+ assert list.getClass() == org.codehaus.groovy.runtime.NullObject
+ assert list.is(null)
+
+ list = [1,2,4]
+ assert list instanceof ArrayList
+ }
+
+ @TypeChecked(TypeCheckingMode.SKIP)
+ void testTypeVariables() {
+ int rate = 200
+ try {
+ rate = [12] //GroovyCastException
+ rate = "nill" //GroovyCastException
+ } catch(GroovyCastException) {
+ println "Cannot assign anything other than integer"
+ }
+ }
+
+ @TypeChecked(TypeCheckingMode.SKIP)
+ void testDefVariableMultipleAssignment() {
+ def rate
+ assert rate == null
+ assert rate.getClass() == org.codehaus.groovy.runtime.NullObject
+
+ rate = 12
+ assert rate instanceof Integer
+
+ rate = "Not Available"
+ assert rate instanceof String
+
+ rate = [1, 4]
+ assert rate instanceof List
+
+ assert divide(12, 3) instanceof BigDecimal
+ assert divide(1, 0) instanceof String
+
+ }
+
+ def divide(int x, int y) {
+ if(y==0) {
+ return "Should not divide by 0"
+ } else {
+ return x/y
+ }
+ }
+
+ def greetMsg() {
+ println "Hello! I am Groovy"
+ }
+
+ void testDefVsType() {
+ def int count
+ assert count instanceof Integer
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-2/pom.xml b/persistence-modules/spring-data-jpa-2/pom.xml
index 8e46112659..251007ba6d 100644
--- a/persistence-modules/spring-data-jpa-2/pom.xml
+++ b/persistence-modules/spring-data-jpa-2/pom.xml
@@ -1,12 +1,13 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.baeldung
+
+ com.baeldung
spring-data-jpa-2
- spring-data-jpa
-
+ spring-data-jpa
+
parent-boot-2
com.baeldung
@@ -19,12 +20,22 @@
org.springframework.boot
spring-boot-starter-data-jpa
-
+
com.h2database
h2
-
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+
+ org.springframework
+ spring-oxm
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/config/JpaPopulators.java b/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/config/JpaPopulators.java
new file mode 100644
index 0000000000..24348d31c5
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/config/JpaPopulators.java
@@ -0,0 +1,35 @@
+package com.baeldung.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.data.repository.init.Jackson2RepositoryPopulatorFactoryBean;
+import org.springframework.data.repository.init.UnmarshallerRepositoryPopulatorFactoryBean;
+import org.springframework.oxm.jaxb.Jaxb2Marshaller;
+
+import com.baeldung.entity.Fruit;
+
+@Configuration
+public class JpaPopulators {
+
+ @Bean
+ public Jackson2RepositoryPopulatorFactoryBean getRespositoryPopulator() throws Exception {
+ Jackson2RepositoryPopulatorFactoryBean factory = new Jackson2RepositoryPopulatorFactoryBean();
+ factory.setResources(new Resource[] { new ClassPathResource("fruit-data.json") });
+ return factory;
+ }
+
+ @Bean
+ public UnmarshallerRepositoryPopulatorFactoryBean repositoryPopulator() {
+
+ Jaxb2Marshaller unmarshaller = new Jaxb2Marshaller();
+ unmarshaller.setClassesToBeBound(Fruit.class);
+
+ UnmarshallerRepositoryPopulatorFactoryBean factory = new UnmarshallerRepositoryPopulatorFactoryBean();
+ factory.setUnmarshaller(unmarshaller);
+ factory.setResources(new Resource[] { new ClassPathResource("apple-fruit-data.xml"), new ClassPathResource("guava-fruit-data.xml") });
+ return factory;
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/entity/Fruit.java b/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/entity/Fruit.java
index f82022e67e..d45ac33db8 100644
--- a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/entity/Fruit.java
+++ b/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/entity/Fruit.java
@@ -2,7 +2,9 @@ package com.baeldung.entity;
import javax.persistence.Entity;
import javax.persistence.Id;
+import javax.xml.bind.annotation.XmlRootElement;
+@XmlRootElement
@Entity
public class Fruit {
diff --git a/persistence-modules/spring-data-jpa-2/src/main/resources/apple-fruit-data.xml b/persistence-modules/spring-data-jpa-2/src/main/resources/apple-fruit-data.xml
new file mode 100644
index 0000000000..d87ae28f1e
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-2/src/main/resources/apple-fruit-data.xml
@@ -0,0 +1,7 @@
+
+
+
+ 1
+ apple
+ red
+
diff --git a/persistence-modules/spring-data-jpa-2/src/main/resources/fruit-data.json b/persistence-modules/spring-data-jpa-2/src/main/resources/fruit-data.json
new file mode 100644
index 0000000000..6dc44e2586
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-2/src/main/resources/fruit-data.json
@@ -0,0 +1,14 @@
+[
+ {
+ "_class": "com.baeldung.entity.Fruit",
+ "name": "apple",
+ "color": "red",
+ "id": 1
+ },
+ {
+ "_class": "com.baeldung.entity.Fruit",
+ "name": "guava",
+ "color": "green",
+ "id": 2
+ }
+]
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-2/src/main/resources/guava-fruit-data.xml b/persistence-modules/spring-data-jpa-2/src/main/resources/guava-fruit-data.xml
new file mode 100644
index 0000000000..ffd75bb4bb
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-2/src/main/resources/guava-fruit-data.xml
@@ -0,0 +1,7 @@
+
+
+
+ 2
+ guava
+ green
+
diff --git a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitPopulatorTest.java b/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitPopulatorTest.java
new file mode 100644
index 0000000000..29ef52dcef
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitPopulatorTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.repository;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.baeldung.entity.Fruit;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class FruitPopulatorTest {
+
+ @Autowired
+ private FruitRepository fruitRepository;
+
+ @Test
+ public void givenFruitJsonPopulatorThenShouldInsertRecordOnStart() {
+
+ List fruits = fruitRepository.findAll();
+ assertEquals("record count is not matching", 2, fruits.size());
+
+ fruits.forEach(fruit -> {
+ if (1 == fruit.getId()) {
+ assertEquals("apple", fruit.getName());
+ assertEquals("red", fruit.getColor());
+ } else if (2 == fruit.getId()) {
+ assertEquals("guava", fruit.getName());
+ assertEquals("green", fruit.getColor());
+ }
+ });
+ }
+}
diff --git a/pom.xml b/pom.xml
index 2e31200652..0de4a36336 100644
--- a/pom.xml
+++ b/pom.xml
@@ -376,7 +376,7 @@
cdi
checker-plugin
core-groovy
- core-groovy-2
+ core-groovy-2
diff --git a/spring-boot-rest/README.md b/spring-boot-rest/README.md
index 5b7bbdac60..5abac75452 100644
--- a/spring-boot-rest/README.md
+++ b/spring-boot-rest/README.md
@@ -7,12 +7,10 @@ Module for the articles that are part of the Spring REST E-book:
5. [Entity To DTO Conversion for a Spring REST API](https://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application)
6. [Error Handling for REST with Spring](http://www.baeldung.com/exception-handling-for-rest-with-spring)
7. [REST API Discoverability and HATEOAS](http://www.baeldung.com/restful-web-service-discoverability)
-8.
-9. [REST Pagination in Spring](http://www.baeldung.com/rest-api-pagination-in-spring)
-10. [Test a REST API with Java](http://www.baeldung.com/integration-testing-a-rest-api)
-
-- [HATEOAS for a Spring REST Service](http://www.baeldung.com/rest-api-discoverability-with-spring)
-- [Versioning a REST API](http://www.baeldung.com/rest-versioning)
-- [ETags for REST with Spring](http://www.baeldung.com/etags-for-rest-with-spring)
-- [Testing REST with multiple MIME types](http://www.baeldung.com/testing-rest-api-with-multiple-media-types)
-- [Testing Web APIs with Postman Collections](https://www.baeldung.com/postman-testing-collections)
+8. [REST Pagination in Spring](http://www.baeldung.com/rest-api-pagination-in-spring)
+9. [Test a REST API with Java](http://www.baeldung.com/integration-testing-a-rest-api)
+10. [HATEOAS for a Spring REST Service](http://www.baeldung.com/rest-api-discoverability-with-spring)
+11. [Versioning a REST API](http://www.baeldung.com/rest-versioning)
+12. [ETags for REST with Spring](http://www.baeldung.com/etags-for-rest-with-spring)
+13. [Testing REST with multiple MIME types](http://www.baeldung.com/testing-rest-api-with-multiple-media-types)
+14. [Testing Web APIs with Postman Collections](https://www.baeldung.com/postman-testing-collections)