diff --git a/.gitignore b/.gitignore
index 0e71421ee7..21586748b7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -66,3 +66,10 @@ jmeter/src/main/resources/*-JMeter.csv
**/nb-configuration.xml
core-scala/.cache-main
core-scala/.cache-tests
+
+
+persistence-modules/hibernate5/transaction.log
+apache-avro/src/main/java/com/baeldung/avro/model/
+jta/transaction-logs/
+software-security/sql-injection-samples/derby.log
+spring-soap/src/main/java/com/baeldung/springsoap/gen/
\ No newline at end of file
diff --git a/core-groovy/src/main/groovy/com/baeldung/traits/Car.groovy b/core-groovy/src/main/groovy/com/baeldung/traits/Car.groovy
new file mode 100644
index 0000000000..eb4d1f7f87
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/traits/Car.groovy
@@ -0,0 +1,3 @@
+package com.baeldung
+
+class Car implements VehicleTrait {}
\ No newline at end of file
diff --git a/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy b/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy
index 3f1e694f17..0d395bffcd 100644
--- a/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy
+++ b/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy
@@ -22,7 +22,7 @@ trait UserTrait implements Human {
msg
}
- def whoAmI() {
+ def self() {
return this
}
diff --git a/core-groovy/src/main/groovy/com/baeldung/traits/VehicleTrait.groovy b/core-groovy/src/main/groovy/com/baeldung/traits/VehicleTrait.groovy
new file mode 100644
index 0000000000..f5ae8fab30
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/traits/VehicleTrait.groovy
@@ -0,0 +1,9 @@
+package com.baeldung
+
+trait VehicleTrait extends WheelTrait {
+
+ String showWheels() {
+ return "Num of Wheels $noOfWheels"
+ }
+
+}
\ No newline at end of file
diff --git a/core-groovy/src/main/groovy/com/baeldung/traits/WheelTrait.groovy b/core-groovy/src/main/groovy/com/baeldung/traits/WheelTrait.groovy
new file mode 100644
index 0000000000..364d5b883e
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/traits/WheelTrait.groovy
@@ -0,0 +1,7 @@
+package com.baeldung
+
+trait WheelTrait {
+
+ int noOfWheels
+
+}
\ No newline at end of file
diff --git a/core-groovy/src/test/groovy/com/baeldung/map/MapUnitTest.groovy b/core-groovy/src/test/groovy/com/baeldung/map/MapUnitTest.groovy
new file mode 100644
index 0000000000..97ffc50c76
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/map/MapUnitTest.groovy
@@ -0,0 +1,85 @@
+package com.baeldung.map
+
+import static org.junit.Assert.*
+import org.junit.Test
+
+class MapUnitTest {
+
+ @Test
+ void whenUsingEach_thenMapIsIterated() {
+ def map = [
+ 'FF0000' : 'Red',
+ '00FF00' : 'Lime',
+ '0000FF' : 'Blue',
+ 'FFFF00' : 'Yellow'
+ ]
+
+ map.each { println "Hex Code: $it.key = Color Name: $it.value" }
+ }
+
+ @Test
+ void whenUsingEachWithEntry_thenMapIsIterated() {
+ def map = [
+ 'E6E6FA' : 'Lavender',
+ 'D8BFD8' : 'Thistle',
+ 'DDA0DD' : 'Plum',
+ ]
+
+ map.each { entry -> println "Hex Code: $entry.key = Color Name: $entry.value" }
+ }
+
+ @Test
+ void whenUsingEachWithKeyAndValue_thenMapIsIterated() {
+ def map = [
+ '000000' : 'Black',
+ 'FFFFFF' : 'White',
+ '808080' : 'Gray'
+ ]
+
+ map.each { key, val ->
+ println "Hex Code: $key = Color Name $val"
+ }
+ }
+
+ @Test
+ void whenUsingEachWithIndexAndEntry_thenMapIsIterated() {
+ def map = [
+ '800080' : 'Purple',
+ '4B0082' : 'Indigo',
+ '6A5ACD' : 'Slate Blue'
+ ]
+
+ map.eachWithIndex { entry, index ->
+ def indent = ((index == 0 || index % 2 == 0) ? " " : "")
+ println "$indent Hex Code: $entry.key = Color Name: $entry.value"
+ }
+ }
+
+ @Test
+ void whenUsingEachWithIndexAndKeyAndValue_thenMapIsIterated() {
+ def map = [
+ 'FFA07A' : 'Light Salmon',
+ 'FF7F50' : 'Coral',
+ 'FF6347' : 'Tomato',
+ 'FF4500' : 'Orange Red'
+ ]
+
+ map.eachWithIndex { key, val, index ->
+ def indent = ((index == 0 || index % 2 == 0) ? " " : "")
+ println "$indent Hex Code: $key = Color Name: $val"
+ }
+ }
+
+ @Test
+ void whenUsingForLoop_thenMapIsIterated() {
+ def map = [
+ '2E8B57' : 'Seagreen',
+ '228B22' : 'Forest Green',
+ '008000' : 'Green'
+ ]
+
+ for (entry in map) {
+ println "Hex Code: $entry.key = Color Name: $entry.value"
+ }
+ }
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy b/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy
index 0c74a9be62..85130e8f07 100644
--- a/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy
+++ b/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy
@@ -57,7 +57,7 @@ class TraitsUnitTest extends Specification {
def 'Should return employee instance when using Employee.whoAmI method' () {
when:
- def emp = employee.whoAmI()
+ def emp = employee.self()
then:
emp
emp instanceof Employee
diff --git a/core-java-9/src/main/java/com/baeldung/multireleaseapp/App.java b/core-java-9/src/main/java/com/baeldung/multireleaseapp/App.java
new file mode 100644
index 0000000000..21bbcc01d4
--- /dev/null
+++ b/core-java-9/src/main/java/com/baeldung/multireleaseapp/App.java
@@ -0,0 +1,16 @@
+package com.baeldung.multireleaseapp;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class App {
+
+ private static final Logger logger = LoggerFactory.getLogger(App.class);
+
+ public static void main(String[] args) throws Exception {
+ String dateToCheck = args[0];
+ boolean isLeapYear = DateHelper.checkIfLeapYear(dateToCheck);
+ logger.info("Date given " + dateToCheck + " is leap year: " + isLeapYear);
+ }
+
+}
diff --git a/core-java-9/src/main/java/com/baeldung/multireleaseapp/DateHelper.java b/core-java-9/src/main/java/com/baeldung/multireleaseapp/DateHelper.java
new file mode 100644
index 0000000000..4d943db30b
--- /dev/null
+++ b/core-java-9/src/main/java/com/baeldung/multireleaseapp/DateHelper.java
@@ -0,0 +1,22 @@
+package com.baeldung.multireleaseapp;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DateHelper {
+
+ private static final Logger logger = LoggerFactory.getLogger(DateHelper.class);
+
+ public static boolean checkIfLeapYear(String dateStr) throws Exception {
+ logger.info("Checking for leap year using Java 1 calendar API");
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(dateStr));
+ int year = cal.get(Calendar.YEAR);
+ return (new GregorianCalendar()).isLeapYear(year);
+ }
+
+}
diff --git a/core-java-9/src/main/java9/com/baeldung/multireleaseapp/DateHelper.java b/core-java-9/src/main/java9/com/baeldung/multireleaseapp/DateHelper.java
new file mode 100644
index 0000000000..35fb0ada1e
--- /dev/null
+++ b/core-java-9/src/main/java9/com/baeldung/multireleaseapp/DateHelper.java
@@ -0,0 +1,18 @@
+package com.baeldung.multireleaseapp;
+
+import java.time.LocalDate;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DateHelper {
+
+ private static final Logger logger = LoggerFactory.getLogger(DateHelper.class);
+
+ public static boolean checkIfLeapYear(String dateStr) throws Exception {
+ logger.info("Checking for leap year using Java 9 Date Api");
+ return LocalDate.parse(dateStr)
+ .isLeapYear();
+ }
+
+}
diff --git a/core-java-collections-list/README.md b/core-java-collections-list/README.md
index d1112047ba..3a4a7c69e8 100644
--- a/core-java-collections-list/README.md
+++ b/core-java-collections-list/README.md
@@ -27,3 +27,4 @@
- [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections)
- [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection)
- [Multi Dimensional ArrayList in Java](https://www.baeldung.com/java-multi-dimensional-arraylist)
+- [Determine If All Elements Are the Same in a Java List](https://www.baeldung.com/java-list-all-equal)
diff --git a/core-java-collections-list/pom.xml b/core-java-collections-list/pom.xml
index 737be8ee34..b9b6f4a6a6 100644
--- a/core-java-collections-list/pom.xml
+++ b/core-java-collections-list/pom.xml
@@ -52,6 +52,17 @@
colt
${colt.version}
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-core.version}
+
diff --git a/core-java-collections-list/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java b/core-java-collections-list/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java
new file mode 100644
index 0000000000..bd37e5e74e
--- /dev/null
+++ b/core-java-collections-list/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java
@@ -0,0 +1,96 @@
+package com.baeldung.list.primitive;
+
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import gnu.trove.list.array.TIntArrayList;
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@BenchmarkMode(Mode.SingleShotTime)
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
+@Measurement(batchSize = 100000, iterations = 10)
+@Warmup(batchSize = 100000, iterations = 10)
+@State(Scope.Thread)
+public class PrimitivesListPerformance {
+
+ private List arrayList = new ArrayList<>();
+ private TIntArrayList tList = new TIntArrayList();
+ private cern.colt.list.IntArrayList coltList = new cern.colt.list.IntArrayList();
+ private IntArrayList fastUtilList = new IntArrayList();
+
+ private int getValue = 10;
+
+ @Benchmark
+ public boolean addArrayList() {
+ return arrayList.add(getValue);
+ }
+
+ @Benchmark
+ public boolean addTroveIntList() {
+ return tList.add(getValue);
+ }
+
+ @Benchmark
+ public void addColtIntList() {
+ coltList.add(getValue);
+ }
+
+ @Benchmark
+ public boolean addFastUtilIntList() {
+ return fastUtilList.add(getValue);
+ }
+
+ @Benchmark
+ public int getArrayList() {
+ return arrayList.get(getValue);
+ }
+
+ @Benchmark
+ public int getTroveIntList() {
+ return tList.get(getValue);
+ }
+
+ @Benchmark
+ public int getColtIntList() {
+ return coltList.get(getValue);
+ }
+
+ @Benchmark
+ public int getFastUtilIntList() {
+ return fastUtilList.getInt(getValue);
+ }
+
+ @Benchmark
+ public boolean containsArrayList() {
+ return arrayList.contains(getValue);
+ }
+
+ @Benchmark
+ public boolean containsTroveIntList() {
+ return tList.contains(getValue);
+ }
+
+ @Benchmark
+ public boolean containsColtIntList() {
+ return coltList.contains(getValue);
+ }
+
+ @Benchmark
+ public boolean containsFastUtilIntList() {
+ return fastUtilList.contains(getValue);
+ }
+
+ public static void main(String[] args) throws Exception {
+ Options options = new OptionsBuilder()
+ .include(PrimitivesListPerformance.class.getSimpleName()).threads(1)
+ .forks(1).shouldFailOnError(true)
+ .shouldDoGC(true)
+ .jvmArgs("-server").build();
+ new Runner(options).run();
+ }
+}
diff --git a/core-java-collections/src/test/java/com/baeldung/queueinterface/CustomBaeldungQueueUnitTest.java b/core-java-collections/src/test/java/com/baeldung/queueInterface/CustomBaeldungQueueUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/queueinterface/CustomBaeldungQueueUnitTest.java
rename to core-java-collections/src/test/java/com/baeldung/queueInterface/CustomBaeldungQueueUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/queueinterface/PriorityQueueUnitTest.java b/core-java-collections/src/test/java/com/baeldung/queueInterface/PriorityQueueUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/queueinterface/PriorityQueueUnitTest.java
rename to core-java-collections/src/test/java/com/baeldung/queueInterface/PriorityQueueUnitTest.java
diff --git a/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java b/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java
index 0658ec6101..5f4827bc21 100644
--- a/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java
+++ b/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FileNotFoundException;
+import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
@@ -17,7 +18,6 @@ import org.slf4j.LoggerFactory;
public class WriteCsvFileExampleUnitTest {
private static final Logger LOG = LoggerFactory.getLogger(WriteCsvFileExampleUnitTest.class);
- private static final String CSV_FILE_NAME = "src/test/resources/exampleOutput.csv";
private WriteCsvFileExample csvExample;
@Before
@@ -65,12 +65,12 @@ public class WriteCsvFileExampleUnitTest {
}
@Test
- public void givenDataArray_whenConvertToCSV_thenOutputCreated() {
+ public void givenDataArray_whenConvertToCSV_thenOutputCreated() throws IOException {
List dataLines = new ArrayList();
dataLines.add(new String[] { "John", "Doe", "38", "Comment Data\nAnother line of comment data" });
dataLines.add(new String[] { "Jane", "Doe, Jr.", "19", "She said \"I'm being quoted\"" });
- File csvOutputFile = new File(CSV_FILE_NAME);
+ File csvOutputFile = File.createTempFile("exampleOutput", ".csv");
try (PrintWriter pw = new PrintWriter(csvOutputFile)) {
dataLines.stream()
.map(csvExample::convertToCSV)
@@ -80,5 +80,6 @@ public class WriteCsvFileExampleUnitTest {
}
assertTrue(csvOutputFile.exists());
+ csvOutputFile.deleteOnExit();
}
}
diff --git a/core-java-io/src/test/resources/exampleOutput.csv b/core-java-io/src/test/resources/exampleOutput.csv
deleted file mode 100644
index 45c37f3a3b..0000000000
--- a/core-java-io/src/test/resources/exampleOutput.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-John,Doe,38,Comment Data Another line of comment data
-Jane,"Doe, Jr.",19,"She said ""I'm being quoted"""
\ No newline at end of file
diff --git a/gson/src/test/java/org/baeldung/gson/conversion/JsonObjectConversionsUnitTest.java b/gson/src/test/java/org/baeldung/gson/conversion/JsonObjectConversionsUnitTest.java
new file mode 100644
index 0000000000..847ec1b85d
--- /dev/null
+++ b/gson/src/test/java/org/baeldung/gson/conversion/JsonObjectConversionsUnitTest.java
@@ -0,0 +1,33 @@
+package org.baeldung.gson.conversion;
+
+import com.google.gson.*;
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+
+public class JsonObjectConversionsUnitTest {
+
+ @Test
+ void whenUsingJsonParser_thenConvertToJsonObject() throws Exception {
+ // Example 1: Using JsonParser
+ String json = "{ \"name\": \"Baeldung\", \"java\": true }";
+
+ JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
+
+ Assert.assertTrue(jsonObject.isJsonObject());
+ Assert.assertTrue(jsonObject.get("name").getAsString().equals("Baeldung"));
+ Assert.assertTrue(jsonObject.get("java").getAsBoolean() == true);
+ }
+
+ @Test
+ void whenUsingGsonInstanceFromJson_thenConvertToJsonObject() throws Exception {
+ // Example 2: Using fromJson
+ String json = "{ \"name\": \"Baeldung\", \"java\": true }";
+
+ JsonObject convertedObject = new Gson().fromJson(json, JsonObject.class);
+
+ Assert.assertTrue(convertedObject.isJsonObject());
+ Assert.assertTrue(convertedObject.get("name").getAsString().equals("Baeldung"));
+ Assert.assertTrue(convertedObject.get("java").getAsBoolean() == true);
+ }
+
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/Address.java b/jackson/src/test/java/com/baeldung/jackson/dtos/Address.java
new file mode 100644
index 0000000000..985851f456
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/Address.java
@@ -0,0 +1,33 @@
+package com.baeldung.jackson.dtos;
+
+public class Address {
+
+ String streetNumber;
+ String streetName;
+ String city;
+
+ public String getStreetNumber() {
+ return streetNumber;
+ }
+
+ public void setStreetNumber(String streetNumber) {
+ this.streetNumber = streetNumber;
+ }
+
+ public String getStreetName() {
+ return streetName;
+ }
+
+ public void setStreetName(String streetName) {
+ this.streetName = streetName;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/Person.java b/jackson/src/test/java/com/baeldung/jackson/dtos/Person.java
new file mode 100644
index 0000000000..13093cdcad
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/Person.java
@@ -0,0 +1,47 @@
+package com.baeldung.jackson.dtos;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+
+@JacksonXmlRootElement(localName = "person")
+public final class Person {
+ private String firstName;
+ private String lastName;
+ private List phoneNumbers = new ArrayList<>();
+ private List address = new ArrayList<>();
+
+ public List getAddress() {
+ return address;
+ }
+
+ public void setAddress(List address) {
+ this.address = address;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public List getPhoneNumbers() {
+ return phoneNumbers;
+ }
+
+ public void setPhoneNumbers(List phoneNumbers) {
+ this.phoneNumbers = phoneNumbers;
+ }
+
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/xml/XMLSerializeDeserializeUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/xml/XMLSerializeDeserializeUnitTest.java
index 0e2a52e75c..1d430e9758 100644
--- a/jackson/src/test/java/com/baeldung/jackson/xml/XMLSerializeDeserializeUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/xml/XMLSerializeDeserializeUnitTest.java
@@ -2,19 +2,25 @@ package com.baeldung.jackson.xml;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
import org.junit.Test;
+import com.baeldung.jackson.dtos.Address;
+import com.baeldung.jackson.dtos.Person;
+import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
-import com.fasterxml.jackson.annotation.JsonProperty;
public class XMLSerializeDeserializeUnitTest {
@@ -49,24 +55,76 @@ public class XMLSerializeDeserializeUnitTest {
assertTrue(value.getX() == 1 && value.getY() == 2);
}
- @Test
+ @Test
public void whenJavaGotFromXmlStrWithCapitalElem_thenCorrect() throws IOException {
XmlMapper xmlMapper = new XmlMapper();
- SimpleBeanForCapitalizedFields value = xmlMapper.
- readValue("12",
- SimpleBeanForCapitalizedFields.class);
+ SimpleBeanForCapitalizedFields value = xmlMapper.readValue("12", SimpleBeanForCapitalizedFields.class);
assertTrue(value.getX() == 1 && value.getY() == 2);
}
@Test
public void whenJavaSerializedToXmlFileWithCapitalizedField_thenCorrect() throws IOException {
XmlMapper xmlMapper = new XmlMapper();
- xmlMapper.writeValue(new File("target/simple_bean_capitalized.xml"),
- new SimpleBeanForCapitalizedFields());
+ xmlMapper.writeValue(new File("target/simple_bean_capitalized.xml"), new SimpleBeanForCapitalizedFields());
File file = new File("target/simple_bean_capitalized.xml");
assertNotNull(file);
}
+ @Test
+ public void whenJavaDeserializedFromXmlFile_thenCorrect() throws IOException {
+ XmlMapper xmlMapper = new XmlMapper();
+
+ String xml = "RohanDaye991103473199110334781Name1City12Name2City2";
+ Person value = xmlMapper.readValue(xml, Person.class);
+
+ assertTrue(value.getAddress()
+ .get(0)
+ .getCity()
+ .equalsIgnoreCase("city1")
+ && value.getAddress()
+ .get(1)
+ .getCity()
+ .equalsIgnoreCase("city2"));
+ }
+
+ @Test
+ public void whenJavaSerializedToXmlFile_thenSuccess() throws IOException {
+ XmlMapper xmlMapper = new XmlMapper();
+
+ String expectedXml = "RohanDaye991103473199110334781Name1City12Name2City2";
+
+ Person person = new Person();
+
+ person.setFirstName("Rohan");
+ person.setLastName("Daye");
+
+ List ph = new ArrayList<>();
+ ph.add("9911034731");
+ ph.add("9911033478");
+ person.setPhoneNumbers(ph);
+
+ List addresses = new ArrayList<>();
+
+ Address address1 = new Address();
+ address1.setStreetNumber("1");
+ address1.setStreetName("Name1");
+ address1.setCity("City1");
+
+ Address address2 = new Address();
+ address2.setStreetNumber("2");
+ address2.setStreetName("Name2");
+ address2.setCity("City2");
+
+ addresses.add(address1);
+ addresses.add(address2);
+
+ person.setAddress(addresses);
+
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ xmlMapper.writeValue(byteArrayOutputStream, person);
+ assertEquals(expectedXml, byteArrayOutputStream.toString());
+ }
+
private static String inputStreamToString(InputStream is) throws IOException {
BufferedReader br;
StringBuilder sb = new StringBuilder();
@@ -103,10 +161,10 @@ class SimpleBean {
}
-class SimpleBeanForCapitalizedFields {
- @JsonProperty("X")
- private int x = 1;
- private int y = 2;
+class SimpleBeanForCapitalizedFields {
+ @JsonProperty("X")
+ private int x = 1;
+ private int y = 2;
public int getX() {
return x;
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java
index b02b67f685..b3aaf8925f 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java
@@ -9,8 +9,10 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Set;
import org.apache.commons.collections4.MultiMapUtils;
+import org.apache.commons.collections4.MultiSet;
import org.apache.commons.collections4.MultiValuedMap;
import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
import org.apache.commons.collections4.multimap.HashSetValuedHashMap;
@@ -65,25 +67,28 @@ public class MultiValuedMapUnitTest {
@Test
public void givenMultiValuesMap_whenUsingKeysMethod_thenReturningAllKeys() {
MultiValuedMap map = new ArrayListValuedHashMap<>();
-
map.put("fruits", "apple");
map.put("fruits", "orange");
map.put("vehicles", "car");
map.put("vehicles", "bike");
- assertThat(((Collection) map.keys())).contains("fruits", "vehicles");
+ MultiSet keys = map.keys();
+
+ assertThat((keys)).contains("fruits", "vehicles");
+
}
@Test
public void givenMultiValuesMap_whenUsingKeySetMethod_thenReturningAllKeys() {
MultiValuedMap map = new ArrayListValuedHashMap<>();
-
map.put("fruits", "apple");
map.put("fruits", "orange");
map.put("vehicles", "car");
map.put("vehicles", "bike");
- assertThat((Collection) map.keySet()).contains("fruits", "vehicles");
+ Set keys = map.keySet();
+
+ assertThat(keys).contains("fruits", "vehicles");
}
diff --git a/json/pom.xml b/json/pom.xml
index 23955e5a75..7a6d57c28e 100644
--- a/json/pom.xml
+++ b/json/pom.xml
@@ -73,6 +73,12 @@
${commons-collections4.version}
test
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
@@ -86,6 +92,7 @@
2.9.7
4.12
1.1.2
+ 3.11.1
diff --git a/json/src/main/java/com/baeldung/jsonobject/iterate/JSONObjectIterator.java b/json/src/main/java/com/baeldung/jsonobject/iterate/JSONObjectIterator.java
new file mode 100644
index 0000000000..0ff8650652
--- /dev/null
+++ b/json/src/main/java/com/baeldung/jsonobject/iterate/JSONObjectIterator.java
@@ -0,0 +1,50 @@
+package com.baeldung.jsonobject.iterate;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+public class JSONObjectIterator {
+
+ private Map keyValuePairs;
+
+ public JSONObjectIterator() {
+ keyValuePairs = new HashMap<>();
+ }
+
+ public void handleValue(String key, Object value) {
+ if (value instanceof JSONArray) {
+ handleJSONArray(key, (JSONArray) value);
+ } else if (value instanceof JSONObject) {
+ handleJSONObject((JSONObject) value);
+ }
+ keyValuePairs.put(key, value);
+ }
+
+ public void handleJSONObject(JSONObject jsonObject) {
+ Iterator jsonObjectIterator = jsonObject.keys();
+ jsonObjectIterator.forEachRemaining(key -> {
+ Object value = jsonObject.get(key);
+ handleValue(key, value);
+ });
+ }
+
+ public void handleJSONArray(String key, JSONArray jsonArray) {
+ Iterator
diff --git a/spring-boot-crud/pom.xml b/spring-boot-crud/pom.xml
index 749bf9cb5a..73635b0a1c 100644
--- a/spring-boot-crud/pom.xml
+++ b/spring-boot-crud/pom.xml
@@ -3,15 +3,14 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4.0.0
- com.baeldung.spring-boot-crud
spring-boot-crud
- 0.1.0
spring-boot-crud
- org.springframework.boot
- spring-boot-starter-parent
- 2.0.6.RELEASE
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
@@ -41,11 +40,7 @@
h2
runtime
-
-
- UTF-8
- 1.8
-
+
spring-boot-crud
@@ -62,4 +57,10 @@
+
+
+ UTF-8
+ 1.8
+
+
\ No newline at end of file
diff --git a/spring-boot-data/README.md b/spring-boot-data/README.md
new file mode 100644
index 0000000000..21f7303c48
--- /dev/null
+++ b/spring-boot-data/README.md
@@ -0,0 +1,2 @@
+### Relevant Articles:
+- [Formatting JSON Dates in Spring ](https://www.baeldung.com/spring-boot-formatting-json-dates)
\ No newline at end of file
diff --git a/spring-boot-data/pom.xml b/spring-boot-data/pom.xml
new file mode 100644
index 0000000000..9ef4cc69c8
--- /dev/null
+++ b/spring-boot-data/pom.xml
@@ -0,0 +1,122 @@
+
+
+ 4.0.0
+ spring-boot-data
+ war
+ spring-boot-data
+ Spring Boot Data Module
+
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-tomcat
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+ spring-boot
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+
+
+
+ pl.project13.maven
+ git-commit-id-plugin
+ ${git-commit-id-plugin.version}
+
+
+ get-the-git-infos
+
+ revision
+
+ initialize
+
+
+ validate-the-git-infos
+
+ validateRevision
+
+ package
+
+
+
+ true
+ ${project.build.outputDirectory}/git.properties
+
+
+
+
+
+
+
+
+ autoconfiguration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*LiveTest.java
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+ **/AutoconfigurationTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+
+
+
+
+
+ com.baeldung.SpringBootDataApplication
+ 2.2.4
+
+
+
\ No newline at end of file
diff --git a/spring-boot-data/src/main/java/com/baeldung/SpringBootDataApplication.java b/spring-boot-data/src/main/java/com/baeldung/SpringBootDataApplication.java
new file mode 100644
index 0000000000..3aa093bb41
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/SpringBootDataApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringBootDataApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootDataApplication.class, args);
+ }
+
+}
diff --git a/spring-boot-data/src/main/java/com/baeldung/jsondateformat/Contact.java b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/Contact.java
new file mode 100644
index 0000000000..f131d17196
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/Contact.java
@@ -0,0 +1,70 @@
+package com.baeldung.jsondateformat;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+public class Contact {
+
+ private String name;
+ private String address;
+ private String phone;
+
+ @JsonFormat(pattern="yyyy-MM-dd")
+ private LocalDate birthday;
+
+ @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime lastUpdate;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public LocalDate getBirthday() {
+ return birthday;
+ }
+
+ public void setBirthday(LocalDate birthday) {
+ this.birthday = birthday;
+ }
+
+ public LocalDateTime getLastUpdate() {
+ return lastUpdate;
+ }
+
+ public void setLastUpdate(LocalDateTime lastUpdate) {
+ this.lastUpdate = lastUpdate;
+ }
+
+ public Contact() {
+ }
+
+ public Contact(String name, String address, String phone, LocalDate birthday, LocalDateTime lastUpdate) {
+ this.name = name;
+ this.address = address;
+ this.phone = phone;
+ this.birthday = birthday;
+ this.lastUpdate = lastUpdate;
+ }
+}
diff --git a/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactApp.java b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactApp.java
new file mode 100644
index 0000000000..79037e1038
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactApp.java
@@ -0,0 +1,13 @@
+package com.baeldung.jsondateformat;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ContactApp {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ContactApp.class, args);
+ }
+
+}
diff --git a/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactAppConfig.java b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactAppConfig.java
new file mode 100644
index 0000000000..7a20ebfa51
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactAppConfig.java
@@ -0,0 +1,33 @@
+package com.baeldung.jsondateformat;
+
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
+
+import java.time.format.DateTimeFormatter;
+
+@Configuration
+public class ContactAppConfig {
+
+ private static final String dateFormat = "yyyy-MM-dd";
+
+ private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
+
+ @Bean
+ @ConditionalOnProperty(value = "spring.jackson.date-format", matchIfMissing = true, havingValue = "none")
+ public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
+ return new Jackson2ObjectMapperBuilderCustomizer() {
+ @Override
+ public void customize(Jackson2ObjectMapperBuilder builder) {
+ builder.simpleDateFormat(dateTimeFormat);
+ builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
+ builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
+ }
+ };
+ }
+
+}
diff --git a/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactController.java b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactController.java
new file mode 100644
index 0000000000..8894d82fc7
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactController.java
@@ -0,0 +1,77 @@
+package com.baeldung.jsondateformat;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@RestController
+@RequestMapping(value = "/contacts")
+public class ContactController {
+
+ @GetMapping
+ public List getContacts() {
+ List contacts = new ArrayList<>();
+
+ Contact contact1 = new Contact("John Doe", "123 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now());
+ Contact contact2 = new Contact("John Doe 2", "124 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now());
+ Contact contact3 = new Contact("John Doe 3", "125 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now());
+
+ contacts.add(contact1);
+ contacts.add(contact2);
+ contacts.add(contact3);
+
+ return contacts;
+ }
+
+ @GetMapping("/javaUtilDate")
+ public List getContactsWithJavaUtilDate() {
+ List contacts = new ArrayList<>();
+
+ ContactWithJavaUtilDate contact1 = new ContactWithJavaUtilDate("John Doe", "123 Sesame Street", "123-456-789", new Date(), new Date());
+ ContactWithJavaUtilDate contact2 = new ContactWithJavaUtilDate("John Doe 2", "124 Sesame Street", "123-456-789", new Date(), new Date());
+ ContactWithJavaUtilDate contact3 = new ContactWithJavaUtilDate("John Doe 3", "125 Sesame Street", "123-456-789", new Date(), new Date());
+
+ contacts.add(contact1);
+ contacts.add(contact2);
+ contacts.add(contact3);
+
+ return contacts;
+ }
+
+ @GetMapping("/plain")
+ public List getPlainContacts() {
+ List contacts = new ArrayList<>();
+
+ PlainContact contact1 = new PlainContact("John Doe", "123 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now());
+ PlainContact contact2 = new PlainContact("John Doe 2", "124 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now());
+ PlainContact contact3 = new PlainContact("John Doe 3", "125 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now());
+
+ contacts.add(contact1);
+ contacts.add(contact2);
+ contacts.add(contact3);
+
+ return contacts;
+ }
+
+ @GetMapping("/plainWithJavaUtilDate")
+ public List getPlainContactsWithJavaUtilDate() {
+ List contacts = new ArrayList<>();
+
+ PlainContactWithJavaUtilDate contact1 = new PlainContactWithJavaUtilDate("John Doe", "123 Sesame Street", "123-456-789", new Date(), new Date());
+ PlainContactWithJavaUtilDate contact2 = new PlainContactWithJavaUtilDate("John Doe 2", "124 Sesame Street", "123-456-789", new Date(), new Date());
+ PlainContactWithJavaUtilDate contact3 = new PlainContactWithJavaUtilDate("John Doe 3", "125 Sesame Street", "123-456-789", new Date(), new Date());
+
+ contacts.add(contact1);
+ contacts.add(contact2);
+ contacts.add(contact3);
+
+ return contacts;
+ }
+
+}
diff --git a/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactWithJavaUtilDate.java b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactWithJavaUtilDate.java
new file mode 100644
index 0000000000..5a1c508098
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactWithJavaUtilDate.java
@@ -0,0 +1,69 @@
+package com.baeldung.jsondateformat;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+public class ContactWithJavaUtilDate {
+
+ private String name;
+ private String address;
+ private String phone;
+
+ @JsonFormat(pattern="yyyy-MM-dd")
+ private Date birthday;
+
+ @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private Date lastUpdate;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public Date getBirthday() {
+ return birthday;
+ }
+
+ public void setBirthday(Date birthday) {
+ this.birthday = birthday;
+ }
+
+ public Date getLastUpdate() {
+ return lastUpdate;
+ }
+
+ public void setLastUpdate(Date lastUpdate) {
+ this.lastUpdate = lastUpdate;
+ }
+
+ public ContactWithJavaUtilDate() {
+ }
+
+ public ContactWithJavaUtilDate(String name, String address, String phone, Date birthday, Date lastUpdate) {
+ this.name = name;
+ this.address = address;
+ this.phone = phone;
+ this.birthday = birthday;
+ this.lastUpdate = lastUpdate;
+ }
+}
diff --git a/spring-boot-data/src/main/java/com/baeldung/jsondateformat/PlainContact.java b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/PlainContact.java
new file mode 100644
index 0000000000..7e9e53d205
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/PlainContact.java
@@ -0,0 +1,66 @@
+package com.baeldung.jsondateformat;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+public class PlainContact {
+
+ private String name;
+ private String address;
+ private String phone;
+
+ private LocalDate birthday;
+
+ private LocalDateTime lastUpdate;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public LocalDate getBirthday() {
+ return birthday;
+ }
+
+ public void setBirthday(LocalDate birthday) {
+ this.birthday = birthday;
+ }
+
+ public LocalDateTime getLastUpdate() {
+ return lastUpdate;
+ }
+
+ public void setLastUpdate(LocalDateTime lastUpdate) {
+ this.lastUpdate = lastUpdate;
+ }
+
+ public PlainContact() {
+ }
+
+ public PlainContact(String name, String address, String phone, LocalDate birthday, LocalDateTime lastUpdate) {
+ this.name = name;
+ this.address = address;
+ this.phone = phone;
+ this.birthday = birthday;
+ this.lastUpdate = lastUpdate;
+ }
+}
diff --git a/spring-boot-data/src/main/java/com/baeldung/jsondateformat/PlainContactWithJavaUtilDate.java b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/PlainContactWithJavaUtilDate.java
new file mode 100644
index 0000000000..daefb15543
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/PlainContactWithJavaUtilDate.java
@@ -0,0 +1,69 @@
+package com.baeldung.jsondateformat;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+public class PlainContactWithJavaUtilDate {
+
+ private String name;
+ private String address;
+ private String phone;
+
+ @JsonFormat(pattern="yyyy-MM-dd")
+ private Date birthday;
+
+ @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private Date lastUpdate;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public Date getBirthday() {
+ return birthday;
+ }
+
+ public void setBirthday(Date birthday) {
+ this.birthday = birthday;
+ }
+
+ public Date getLastUpdate() {
+ return lastUpdate;
+ }
+
+ public void setLastUpdate(Date lastUpdate) {
+ this.lastUpdate = lastUpdate;
+ }
+
+ public PlainContactWithJavaUtilDate() {
+ }
+
+ public PlainContactWithJavaUtilDate(String name, String address, String phone, Date birthday, Date lastUpdate) {
+ this.name = name;
+ this.address = address;
+ this.phone = phone;
+ this.birthday = birthday;
+ this.lastUpdate = lastUpdate;
+ }
+}
diff --git a/spring-boot-data/src/main/resources/application.properties b/spring-boot-data/src/main/resources/application.properties
new file mode 100644
index 0000000000..845b783634
--- /dev/null
+++ b/spring-boot-data/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=Europe/Zagreb
\ No newline at end of file
diff --git a/spring-boot-data/src/test/java/com/baeldung/jsondateformat/ContactAppIntegrationTest.java b/spring-boot-data/src/test/java/com/baeldung/jsondateformat/ContactAppIntegrationTest.java
new file mode 100644
index 0000000000..f76440d1bc
--- /dev/null
+++ b/spring-boot-data/src/test/java/com/baeldung/jsondateformat/ContactAppIntegrationTest.java
@@ -0,0 +1,100 @@
+package com.baeldung.jsondateformat;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+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.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = RANDOM_PORT, classes = ContactApp.class)
+@TestPropertySource(properties = {
+ "spring.jackson.date-format=yyyy-MM-dd HH:mm:ss"
+})
+public class ContactAppIntegrationTest {
+
+ private final ObjectMapper mapper = new ObjectMapper();
+
+ @LocalServerPort
+ private int port;
+
+ @Autowired
+ private TestRestTemplate restTemplate;
+
+ @Test
+ public void givenJsonFormatAnnotationAndJava8DateType_whenGet_thenReturnExpectedDateFormat() throws IOException, ParseException {
+ ResponseEntity response = restTemplate.getForEntity("http://localhost:" + port + "/contacts", String.class);
+
+ assertEquals(200, response.getStatusCodeValue());
+
+ List