diff --git a/aspectj/pom.xml b/aspectj/pom.xml
index 2a1cff11c8..1c409483ec 100644
--- a/aspectj/pom.xml
+++ b/aspectj/pom.xml
@@ -98,13 +98,14 @@
compile
- test-compile
+ test-compile
-
+
+ -->
diff --git a/aspectj/src/main/java/com/baeldung/aspectj/Account.java b/aspectj/src/main/java/com/baeldung/aspectj/Account.java
index 59cab72ebf..bc9ca375aa 100644
--- a/aspectj/src/main/java/com/baeldung/aspectj/Account.java
+++ b/aspectj/src/main/java/com/baeldung/aspectj/Account.java
@@ -4,10 +4,10 @@ public class Account {
int balance = 20;
public boolean withdraw(int amount) {
- if (balance - amount > 0) {
- balance = balance - amount;
- return true;
- } else
+ if (balance < amount) {
return false;
+ }
+ balance = balance - amount;
+ return true;
}
}
diff --git a/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj b/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj
index 2ddf03192b..8423c1da97 100644
--- a/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj
+++ b/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj
@@ -16,12 +16,11 @@ public aspect AccountAspect {
}
boolean around(int amount, Account account) : callWithDraw(amount, account) {
- if (account.balance - amount >= MIN_BALANCE)
- return proceed(amount, account);
- else {
+ if (account.balance < amount) {
logger.info("Withdrawal Rejected!");
return false;
}
+ return proceed(amount, account);
}
after(int amount, Account balance) : callWithDraw(amount, balance) {
diff --git a/core-java/src/main/java/com/baeldung/generics/Building.java b/core-java/src/main/java/com/baeldung/generics/Building.java
new file mode 100644
index 0000000000..a34dcd3c7e
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/generics/Building.java
@@ -0,0 +1,12 @@
+package com.baeldung.generics;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Building {
+ private static final Logger LOGGER = LoggerFactory.getLogger(Building.class);
+
+ public void paint() {
+ LOGGER.info("Painting Building");
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/generics/Generics.java b/core-java/src/main/java/com/baeldung/generics/Generics.java
index 69c7baddd3..e0536ca02e 100644
--- a/core-java/src/main/java/com/baeldung/generics/Generics.java
+++ b/core-java/src/main/java/com/baeldung/generics/Generics.java
@@ -1,23 +1,31 @@
package com.baeldung.generics;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
public class Generics {
// definition of a generic method
public static List fromArrayToList(T[] a) {
- List list = new ArrayList<>();
- Arrays.stream(a).forEach(list::add);
- return list;
+ return Arrays.stream(a).collect(Collectors.toList());
+ }
+
+ // definition of a generic method
+ public static List fromArrayToList(T[] a, Function mapperFunction) {
+ return Arrays.stream(a).map(mapperFunction).collect(Collectors.toList());
}
// example of a generic method that has Number as an upper bound for T
public static List fromArrayToListWithUpperBound(T[] a) {
- List list = new ArrayList<>();
- Arrays.stream(a).forEach(list::add);
- return list;
+ return Arrays.stream(a).collect(Collectors.toList());
}
-}
+ // example of a generic method with a wild card, this method can be used
+ // with a list of any subtype of Building
+ public static void paintAllBuildings(List extends Building> buildings) {
+ buildings.forEach(Building::paint);
+ }
+
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/generics/House.java b/core-java/src/main/java/com/baeldung/generics/House.java
new file mode 100644
index 0000000000..88e7d2710a
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/generics/House.java
@@ -0,0 +1,12 @@
+package com.baeldung.generics;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class House extends Building {
+ private static final Logger LOGGER = LoggerFactory.getLogger(House.class);
+
+ public void paint() {
+ LOGGER.info("Painting House");
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java b/core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java
index 9c8fc86e7a..4fa164cadc 100644
--- a/core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java
+++ b/core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java
@@ -1,6 +1,5 @@
package com.baeldung.hashing;
-
import com.google.common.hash.Hashing;
import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.util.encoders.Hex;
@@ -11,17 +10,14 @@ import java.security.NoSuchAlgorithmException;
public class SHA256Hashing {
- public static String HashWithJavaMessageDigest(final String originalString)
- throws NoSuchAlgorithmException {
+ public static String HashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException {
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
- final byte[] encodedhash = digest.digest(
- originalString.getBytes(StandardCharsets.UTF_8));
+ final byte[] encodedhash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
return bytesToHex(encodedhash);
}
public static String HashWithGuava(final String originalString) {
- final String sha256hex = Hashing.sha256().hashString(
- originalString, StandardCharsets.UTF_8).toString();
+ final String sha256hex = Hashing.sha256().hashString(originalString, StandardCharsets.UTF_8).toString();
return sha256hex;
}
@@ -30,11 +26,9 @@ public class SHA256Hashing {
return sha256hex;
}
- public static String HashWithBouncyCastle(final String originalString)
- throws NoSuchAlgorithmException {
+ public static String HashWithBouncyCastle(final String originalString) throws NoSuchAlgorithmException {
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
- final byte[] hash = digest.digest(
- originalString.getBytes(StandardCharsets.UTF_8));
+ final byte[] hash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
final String sha256hex = new String(Hex.encode(hash));
return sha256hex;
}
@@ -43,7 +37,8 @@ public class SHA256Hashing {
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
- if(hex.length() == 1) hexString.append('0');
+ if (hex.length() == 1)
+ hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
diff --git a/core-java/src/main/java/com/baeldung/java/nio2/visitor/FileSearchExample.java b/core-java/src/main/java/com/baeldung/java/nio2/visitor/FileSearchExample.java
new file mode 100644
index 0000000000..b1b790f541
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/java/nio2/visitor/FileSearchExample.java
@@ -0,0 +1,56 @@
+package com.baeldung.java.nio2.visitor;
+
+import java.io.IOException;
+import java.nio.file.*;
+import java.nio.file.attribute.BasicFileAttributes;
+
+import static java.nio.file.FileVisitResult.CONTINUE;
+import static java.nio.file.FileVisitResult.TERMINATE;
+
+public class FileSearchExample implements FileVisitor {
+ private final String fileName;
+ private final Path startDir;
+
+ public FileSearchExample(String fileName, Path startingDir) {
+ this.fileName = fileName;
+ startDir = startingDir;
+ }
+
+ @Override
+ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+ return CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+ String fileName = file.getFileName().toString();
+ if (this.fileName.equals(fileName)) {
+ System.out.println("File found: " + file.toString());
+ return TERMINATE;
+ }
+ return CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
+ System.out.println("Failed to access file: " + file.toString());
+ return CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+ boolean finishedSearch = Files.isSameFile(dir, startDir);
+ if (finishedSearch) {
+ System.out.println("File:" + fileName + " not found");
+ return TERMINATE;
+ }
+ return CONTINUE;
+ }
+
+ public static void main(String[] args) throws IOException {
+ Path startingDir = Paths.get("C:/Users/new/Desktop");
+ FileSearchExample crawler = new FileSearchExample("hibernate.txt", startingDir);
+ Files.walkFileTree(startingDir, crawler);
+ }
+
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/java/nio2/visitor/FileVisitorImpl.java b/core-java/src/main/java/com/baeldung/java/nio2/visitor/FileVisitorImpl.java
new file mode 100644
index 0000000000..aa769b5091
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/java/nio2/visitor/FileVisitorImpl.java
@@ -0,0 +1,30 @@
+package com.baeldung.java.nio2.visitor;
+
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.FileVisitor;
+import java.nio.file.Path;
+import java.nio.file.attribute.BasicFileAttributes;
+
+public class FileVisitorImpl implements FileVisitor {
+
+ @Override
+ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
+ return null;
+ }
+
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
+ return null;
+ }
+
+ @Override
+ public FileVisitResult visitFileFailed(Path file, IOException exc) {
+ return null;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java b/core-java/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java
new file mode 100644
index 0000000000..ffc58a1c50
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java
@@ -0,0 +1,25 @@
+package com.baeldung.java.nio2.watcher;
+
+import java.io.IOException;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardWatchEventKinds;
+import java.nio.file.WatchEvent;
+import java.nio.file.WatchKey;
+import java.nio.file.WatchService;
+
+public class DirectoryWatcherExample {
+ public static void main(String[] args) throws IOException, InterruptedException {
+ WatchService watchService = FileSystems.getDefault().newWatchService();
+ Path path = Paths.get(System.getProperty("user.home"));
+ path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
+ WatchKey key;
+ while ((key = watchService.take()) != null) {
+ for (WatchEvent> event : key.pollEvents()) {
+ System.out.println("Event kind:" + event.kind() + ". File affected: " + event.context() + ".");
+ }
+ key.reset();
+ }
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/java_8_features/Person.java b/core-java/src/main/java/com/baeldung/java_8_features/Person.java
new file mode 100644
index 0000000000..82b6819699
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/java_8_features/Person.java
@@ -0,0 +1,39 @@
+package com.baeldung.java_8_features;
+
+import java.util.Optional;
+
+public class Person {
+ private String name;
+ private int age;
+ private String password;
+
+ public Person(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public Optional getName() {
+ return Optional.ofNullable(name);
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Optional getAge() {
+ return Optional.ofNullable(age);
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public Optional getPassword() {
+ return Optional.ofNullable(password);
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/file/FileOperationsUnitTest.java b/core-java/src/test/java/com/baeldung/file/FileOperationsUnitTest.java
index 3319716dc6..16d0cb570b 100644
--- a/core-java/src/test/java/com/baeldung/file/FileOperationsUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/file/FileOperationsUnitTest.java
@@ -1,11 +1,12 @@
package com.baeldung.file;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
+import org.apache.commons.io.FileUtils;
+import org.hamcrest.CoreMatchers;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.*;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
@@ -14,12 +15,6 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
-import org.apache.commons.io.FileUtils;
-import org.hamcrest.CoreMatchers;
-import org.hamcrest.Matchers;
-import org.junit.Assert;
-import org.junit.Test;
-
public class FileOperationsUnitTest {
@Test
@@ -58,9 +53,9 @@ public class FileOperationsUnitTest {
@Test
public void givenURLName_whenUsingURL_thenFileData() throws IOException {
- String expectedData = "Baeldung";
+ String expectedData = "Example Domain";
- URL urlObject = new URL("http://www.baeldung.com/");
+ URL urlObject = new URL("http://www.example.com/");
URLConnection urlConnection = urlObject.openConnection();
diff --git a/core-java/src/test/java/com/baeldung/generics/GenericsTest.java b/core-java/src/test/java/com/baeldung/generics/GenericsTest.java
index 9eb459ccb5..6cbc0eba05 100644
--- a/core-java/src/test/java/com/baeldung/generics/GenericsTest.java
+++ b/core-java/src/test/java/com/baeldung/generics/GenericsTest.java
@@ -2,26 +2,36 @@ package com.baeldung.generics;
import org.junit.Test;
+import java.util.ArrayList;
import java.util.List;
import static org.hamcrest.CoreMatchers.hasItems;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.fail;
public class GenericsTest {
// testing the generic method with Integer
@Test
public void givenArrayOfIntegers_thanListOfIntegersReturnedOK() {
- Integer[] intArray = {1, 2, 3, 4, 5};
+ Integer[] intArray = { 1, 2, 3, 4, 5 };
List list = Generics.fromArrayToList(intArray);
assertThat(list, hasItems(intArray));
}
+ // testing the generic method with Integer and String type
+ @Test
+ public void givenArrayOfIntegers_thanListOfStringReturnedOK() {
+ Integer[] intArray = { 1, 2, 3, 4, 5 };
+ List stringList = Generics.fromArrayToList(intArray, Object::toString);
+ assertThat(stringList, hasItems("1", "2", "3", "4", "5"));
+ }
+
// testing the generic method with String
@Test
public void givenArrayOfStrings_thanListOfStringsReturnedOK() {
- String[] stringArray = {"hello1", "hello2", "hello3", "hello4", "hello5"};
+ String[] stringArray = { "hello1", "hello2", "hello3", "hello4", "hello5" };
List list = Generics.fromArrayToList(stringArray);
assertThat(list, hasItems(stringArray));
@@ -32,10 +42,28 @@ public class GenericsTest {
// extend Number it will fail to compile
@Test
public void givenArrayOfIntegersAndNumberUpperBound_thanListOfIntegersReturnedOK() {
- Integer[] intArray = {1, 2, 3, 4, 5};
+ Integer[] intArray = { 1, 2, 3, 4, 5 };
List list = Generics.fromArrayToListWithUpperBound(intArray);
assertThat(list, hasItems(intArray));
}
-}
+ // testing paintAllBuildings method with a subtype of Building, the method
+ // will work with all subtypes of Building
+ @Test
+ public void givenSubTypeOfWildCardBoundedGenericType_thanPaintingOK() {
+ try {
+ List subBuildingsList = new ArrayList<>();
+ subBuildingsList.add(new Building());
+ subBuildingsList.add(new House());
+
+ // prints
+ // Painting Building
+ // Painting House
+ Generics.paintAllBuildings(subBuildingsList);
+ } catch (Exception e) {
+ fail();
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/hashing/SHA256HashingTest.java b/core-java/src/test/java/com/baeldung/hashing/SHA256HashingTest.java
index dc496d589b..ce77b824d8 100644
--- a/core-java/src/test/java/com/baeldung/hashing/SHA256HashingTest.java
+++ b/core-java/src/test/java/com/baeldung/hashing/SHA256HashingTest.java
@@ -4,12 +4,10 @@ import org.junit.Test;
import static org.junit.Assert.*;
-
public class SHA256HashingTest {
private static String originalValue = "abc123";
- private static String hashedValue =
- "6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090";
+ private static String hashedValue = "6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090";
@Test
public void testHashWithJavaMessageDigest() throws Exception {
diff --git a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java
index 09cacd0a29..9a4ac053af 100644
--- a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java
+++ b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java
@@ -119,8 +119,7 @@ public class StringConversionTest {
int afterConvCalendarDay = 03;
Month afterConvCalendarMonth = Month.DECEMBER;
int afterConvCalendarYear = 2007;
- LocalDateTime afterConvDate
- = new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str);
+ LocalDateTime afterConvDate = new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str);
assertEquals(afterConvDate.getDayOfMonth(), afterConvCalendarDay);
assertEquals(afterConvDate.getMonth(), afterConvCalendarMonth);
diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoClient.java b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoClient.java
new file mode 100644
index 0000000000..da586706a2
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoClient.java
@@ -0,0 +1,86 @@
+package com.baeldung.java.nio2.async;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.AsynchronousSocketChannel;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+public class AsyncEchoClient {
+ private AsynchronousSocketChannel client;
+ private Future future;
+ private static AsyncEchoClient instance;
+
+ private AsyncEchoClient() {
+ try {
+ client = AsynchronousSocketChannel.open();
+ InetSocketAddress hostAddress = new InetSocketAddress("localhost", 4999);
+ future = client.connect(hostAddress);
+ start();
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static AsyncEchoClient getInstance() {
+ if (instance == null)
+ instance = new AsyncEchoClient();
+ return instance;
+ }
+
+ private void start() {
+ try {
+ future.get();
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public String sendMessage(String message) {
+ byte[] byteMsg = message.getBytes();
+ ByteBuffer buffer = ByteBuffer.wrap(byteMsg);
+ Future writeResult = client.write(buffer);
+
+ try {
+ writeResult.get();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ buffer.flip();
+ Future readResult = client.read(buffer);
+ try {
+ readResult.get();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ String echo = new String(buffer.array()).trim();
+ buffer.clear();
+ return echo;
+ }
+
+ public void stop() {
+ try {
+ client.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ AsyncEchoClient client = AsyncEchoClient.getInstance();
+ client.start();
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ String line;
+ System.out.println("Message to server:");
+ while ((line = br.readLine()) != null) {
+ String response = client.sendMessage(line);
+ System.out.println("response from server: " + response);
+ System.out.println("Message to server:");
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer.java b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer.java
new file mode 100644
index 0000000000..01873b344a
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer.java
@@ -0,0 +1,80 @@
+package com.baeldung.java.nio2.async;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.AsynchronousServerSocketChannel;
+import java.nio.channels.AsynchronousSocketChannel;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+public class AsyncEchoServer {
+ private AsynchronousServerSocketChannel serverChannel;
+ private Future acceptResult;
+ private AsynchronousSocketChannel clientChannel;
+
+ public AsyncEchoServer() {
+ try {
+ serverChannel = AsynchronousServerSocketChannel.open();
+ InetSocketAddress hostAddress = new InetSocketAddress("localhost", 4999);
+ serverChannel.bind(hostAddress);
+ acceptResult = serverChannel.accept();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void runServer() {
+ try {
+ clientChannel = acceptResult.get();
+ if ((clientChannel != null) && (clientChannel.isOpen())) {
+ while (true) {
+
+ ByteBuffer buffer = ByteBuffer.allocate(32);
+ Future readResult = clientChannel.read(buffer);
+
+ // do some computation
+
+ readResult.get();
+
+ buffer.flip();
+ String message = new String(buffer.array()).trim();
+ if (message.equals("bye")) {
+ break; // while loop
+ }
+ buffer = ByteBuffer.wrap(new String(message).getBytes());
+ Future writeResult = clientChannel.write(buffer);
+
+ // do some computation
+ writeResult.get();
+ buffer.clear();
+
+ } // while()
+
+ clientChannel.close();
+ serverChannel.close();
+
+ }
+ } catch (InterruptedException | ExecutionException | IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ public static void main(String[] args) {
+ AsyncEchoServer server = new AsyncEchoServer();
+ server.runServer();
+ }
+
+ public static Process start() throws IOException, InterruptedException {
+ String javaHome = System.getProperty("java.home");
+ String javaBin = javaHome + File.separator + "bin" + File.separator + "java";
+ String classpath = System.getProperty("java.class.path");
+ String className = AsyncEchoServer.class.getCanonicalName();
+
+ ProcessBuilder builder = new ProcessBuilder(javaBin, "-cp", classpath, className);
+
+ return builder.start();
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer2.java b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer2.java
new file mode 100644
index 0000000000..663fc4f2ed
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer2.java
@@ -0,0 +1,99 @@
+package com.baeldung.java.nio2.async;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.AsynchronousServerSocketChannel;
+import java.nio.channels.AsynchronousSocketChannel;
+import java.nio.channels.CompletionHandler;
+import java.util.HashMap;
+import java.util.Map;
+
+public class AsyncEchoServer2 {
+ private AsynchronousServerSocketChannel serverChannel;
+ private AsynchronousSocketChannel clientChannel;
+
+ public AsyncEchoServer2() {
+ try {
+ serverChannel = AsynchronousServerSocketChannel.open();
+ InetSocketAddress hostAddress = new InetSocketAddress("localhost", 4999);
+ serverChannel.bind(hostAddress);
+ while (true) {
+
+ serverChannel.accept(null, new CompletionHandler() {
+
+ @Override
+ public void completed(AsynchronousSocketChannel result, Object attachment) {
+ if (serverChannel.isOpen())
+ serverChannel.accept(null, this);
+ clientChannel = result;
+ if ((clientChannel != null) && (clientChannel.isOpen())) {
+ ReadWriteHandler handler = new ReadWriteHandler();
+ ByteBuffer buffer = ByteBuffer.allocate(32);
+ Map readInfo = new HashMap<>();
+ readInfo.put("action", "read");
+ readInfo.put("buffer", buffer);
+ clientChannel.read(buffer, readInfo, handler);
+ }
+ }
+
+ @Override
+ public void failed(Throwable exc, Object attachment) {
+ // process error
+ }
+ });
+ try {
+ System.in.read();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ class ReadWriteHandler implements CompletionHandler> {
+
+ @Override
+ public void completed(Integer result, Map attachment) {
+ Map actionInfo = attachment;
+ String action = (String) actionInfo.get("action");
+ if ("read".equals(action)) {
+ ByteBuffer buffer = (ByteBuffer) actionInfo.get("buffer");
+ buffer.flip();
+ actionInfo.put("action", "write");
+ clientChannel.write(buffer, actionInfo, this);
+ buffer.clear();
+ } else if ("write".equals(action)) {
+ ByteBuffer buffer = ByteBuffer.allocate(32);
+ actionInfo.put("action", "read");
+ actionInfo.put("buffer", buffer);
+ clientChannel.read(buffer, actionInfo, this);
+ }
+
+ }
+
+ @Override
+ public void failed(Throwable exc, Map attachment) {
+
+ }
+
+ }
+
+ public static void main(String[] args) {
+ new AsyncEchoServer2();
+ }
+
+ public static Process start() throws IOException, InterruptedException {
+ String javaHome = System.getProperty("java.home");
+ String javaBin = javaHome + File.separator + "bin" + File.separator + "java";
+ String classpath = System.getProperty("java.class.path");
+ String className = AsyncEchoServer2.class.getCanonicalName();
+
+ ProcessBuilder builder = new ProcessBuilder(javaBin, "-cp", classpath, className);
+
+ return builder.start();
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoTest.java b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoTest.java
new file mode 100644
index 0000000000..93cb3e1eb6
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.java.nio2.async;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+public class AsyncEchoTest {
+
+ Process server;
+ AsyncEchoClient client;
+
+ @Before
+ public void setup() throws IOException, InterruptedException {
+ server = AsyncEchoServer2.start();
+ client = AsyncEchoClient.getInstance();
+ }
+
+ @Test
+ public void givenServerClient_whenServerEchosMessage_thenCorrect() throws Exception {
+ String resp1 = client.sendMessage("hello");
+ String resp2 = client.sendMessage("world");
+ assertEquals("hello", resp1);
+ assertEquals("world", resp2);
+ }
+
+ @After
+ public void teardown() throws IOException {
+ server.destroy();
+ client.stop();
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncFileTest.java b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncFileTest.java
new file mode 100644
index 0000000000..4395017e63
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncFileTest.java
@@ -0,0 +1,126 @@
+package com.baeldung.java.nio2.async;
+
+import org.junit.Test;
+
+import java.io.IOException;
+import java.net.URI;
+import java.nio.ByteBuffer;
+import java.nio.channels.AsynchronousFileChannel;
+import java.nio.channels.CompletionHandler;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import static org.junit.Assert.assertEquals;
+
+public class AsyncFileTest {
+ @Test
+ public void givenPath_whenReadsContentWithFuture_thenCorrect() throws IOException, ExecutionException, InterruptedException {
+ Path path = Paths.get(URI.create(this.getClass().getClassLoader().getResource("file.txt").toString()));
+ AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ);
+
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+
+ Future operation = fileChannel.read(buffer, 0);
+
+ operation.get();
+
+ String fileContent = new String(buffer.array()).trim();
+ buffer.clear();
+
+ assertEquals(fileContent, "baeldung.com");
+ }
+
+ @Test
+ public void givenPath_whenReadsContentWithCompletionHandler_thenCorrect() throws IOException {
+ Path path = Paths.get(URI.create(AsyncFileTest.class.getResource("/file.txt").toString()));
+ AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ);
+
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+
+ fileChannel.read(buffer, 0, buffer, new CompletionHandler() {
+
+ @Override
+ public void completed(Integer result, ByteBuffer attachment) {
+ // result is number of bytes read
+ // attachment is the buffer
+
+ }
+
+ @Override
+ public void failed(Throwable exc, ByteBuffer attachment) {
+
+ }
+ });
+ }
+
+ @Test
+ public void givenPathAndContent_whenWritesToFileWithFuture_thenCorrect() throws IOException, ExecutionException, InterruptedException {
+ String fileName = "temp";
+ Path path = Paths.get(fileName);
+ AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE, StandardOpenOption.CREATE);
+
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+ long position = 0;
+
+ buffer.put("hello world".getBytes());
+ buffer.flip();
+
+ Future operation = fileChannel.write(buffer, position);
+ buffer.clear();
+
+ operation.get();
+
+ String content = readContent(path);
+ assertEquals("hello world", content);
+ }
+
+ @Test
+ public void givenPathAndContent_whenWritesToFileWithHandler_thenCorrect() throws IOException {
+ String fileName = UUID.randomUUID().toString();
+ Path path = Paths.get(fileName);
+ AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.DELETE_ON_CLOSE);
+
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+ buffer.put("hello world".getBytes());
+ buffer.flip();
+
+ fileChannel.write(buffer, 0, buffer, new CompletionHandler() {
+
+ @Override
+ public void completed(Integer result, ByteBuffer attachment) {
+ // result is number of bytes written
+ // attachment is the buffer
+
+ }
+
+ @Override
+ public void failed(Throwable exc, ByteBuffer attachment) {
+
+ }
+ });
+ }
+
+ public static String readContent(Path file) throws ExecutionException, InterruptedException {
+ AsynchronousFileChannel fileChannel = null;
+ try {
+ fileChannel = AsynchronousFileChannel.open(file, StandardOpenOption.READ);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+
+ Future operation = fileChannel.read(buffer, 0);
+
+ operation.get();
+
+ String fileContent = new String(buffer.array()).trim();
+ buffer.clear();
+ return fileContent;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java/nio2/attributes/BasicAttribsTest.java b/core-java/src/test/java/com/baeldung/java/nio2/attributes/BasicAttribsTest.java
new file mode 100644
index 0000000000..24097542d0
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/nio2/attributes/BasicAttribsTest.java
@@ -0,0 +1,69 @@
+package com.baeldung.java.nio2.attributes;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.attribute.BasicFileAttributeView;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.nio.file.attribute.FileTime;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class BasicAttribsTest {
+ private static final String HOME = System.getProperty("user.home");
+ private static BasicFileAttributes basicAttribs;
+
+ @BeforeClass
+ public static void setup() throws IOException {
+ Path home = Paths.get(HOME);
+ BasicFileAttributeView basicView = Files.getFileAttributeView(home, BasicFileAttributeView.class);
+ basicAttribs = basicView.readAttributes();
+ }
+
+ @Test
+ public void givenFileTimes_whenComparesThem_ThenCorrect() {
+ FileTime created = basicAttribs.creationTime();
+ FileTime modified = basicAttribs.lastModifiedTime();
+ FileTime accessed = basicAttribs.lastAccessTime();
+
+ System.out.println("Created: " + created);
+ System.out.println("Modified: " + modified);
+ System.out.println("Accessed: " + accessed);
+
+ }
+
+ @Test
+ public void givenPath_whenGetsFileSize_thenCorrect() {
+ long size = basicAttribs.size();
+ assertTrue(size > 0);
+ }
+
+ @Test
+ public void givenPath_whenChecksIfDirectory_thenCorrect() {
+ boolean isDir = basicAttribs.isDirectory();
+ assertTrue(isDir);
+ }
+
+ @Test
+ public void givenPath_whenChecksIfFile_thenCorrect() {
+ boolean isFile = basicAttribs.isRegularFile();
+ assertFalse(isFile);
+ }
+
+ @Test
+ public void givenPath_whenChecksIfSymLink_thenCorrect() {
+ boolean isSymLink = basicAttribs.isSymbolicLink();
+ assertFalse(isSymLink);
+ }
+
+ @Test
+ public void givenPath_whenChecksIfOther_thenCorrect() {
+ boolean isOther = basicAttribs.isOther();
+ assertFalse(isOther);
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java8/optional/OptionalTest.java b/core-java/src/test/java/com/baeldung/java8/optional/OptionalTest.java
new file mode 100644
index 0000000000..1038043d49
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java8/optional/OptionalTest.java
@@ -0,0 +1,206 @@
+package com.baeldung.java8.optional;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+import org.junit.Test;
+
+import com.baeldung.java_8_features.Person;
+
+public class OptionalTest {
+ // creating Optional
+ @Test
+ public void whenCreatesEmptyOptional_thenCorrect() {
+ Optional empty = Optional.empty();
+ assertFalse(empty.isPresent());
+ }
+
+ @Test
+ public void givenNonNull_whenCreatesNonNullable_thenCorrect() {
+ String name = "baeldung";
+ Optional.of(name);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void givenNull_whenThrowsErrorOnCreate_thenCorrect() {
+ String name = null;
+ Optional opt = Optional.of(name);
+ }
+
+ @Test
+ public void givenNonNull_whenCreatesOptional_thenCorrect() {
+ String name = "baeldung";
+ Optional opt = Optional.of(name);
+ assertEquals("Optional[baeldung]", opt.toString());
+ }
+
+ @Test
+ public void givenNonNull_whenCreatesNullable_thenCorrect() {
+ String name = "baeldung";
+ Optional opt = Optional.ofNullable(name);
+ assertEquals("Optional[baeldung]", opt.toString());
+ }
+
+ @Test
+ public void givenNull_whenCreatesNullable_thenCorrect() {
+ String name = null;
+ Optional opt = Optional.ofNullable(name);
+ assertEquals("Optional.empty", opt.toString());
+ }
+ // Checking Value With isPresent()
+
+ @Test
+ public void givenOptional_whenIsPresentWorks_thenCorrect() {
+ Optional opt = Optional.of("Baeldung");
+ assertTrue(opt.isPresent());
+
+ opt = Optional.ofNullable(null);
+ assertFalse(opt.isPresent());
+ }
+
+ // Condition Action With ifPresent()
+ @Test
+ public void givenOptional_whenIfPresentWorks_thenCorrect() {
+ Optional opt = Optional.of("baeldung");
+ opt.ifPresent(name -> System.out.println(name.length()));
+ }
+
+ // returning Value With get()
+ @Test
+ public void givenOptional_whenGetsValue_thenCorrect() {
+ Optional opt = Optional.of("baeldung");
+ String name = opt.get();
+ assertEquals("baeldung", name);
+ }
+
+ @Test(expected = NoSuchElementException.class)
+ public void givenOptionalWithNull_whenGetThrowsException_thenCorrect() {
+ Optional opt = Optional.ofNullable(null);
+ String name = opt.get();
+ }
+
+ // Conditional Return With filter()
+ @Test
+ public void whenOptionalFilterWorks_thenCorrect() {
+ Integer year = 2016;
+ Optional yearOptional = Optional.of(year);
+ boolean is2016 = yearOptional.filter(y -> y == 2016).isPresent();
+ assertTrue(is2016);
+ boolean is2017 = yearOptional.filter(y -> y == 2017).isPresent();
+ assertFalse(is2017);
+ }
+
+ // Transforming Value With map()
+ @Test
+ public void givenOptional_whenMapWorks_thenCorrect() {
+ List companyNames = Arrays.asList("paypal", "oracle", "", "microsoft", "", "apple");
+ Optional> listOptional = Optional.of(companyNames);
+
+ int size = listOptional.map(List::size).orElse(0);
+ assertEquals(6, size);
+ }
+
+ @Test
+ public void givenOptional_whenMapWorks_thenCorrect2() {
+ String name = "baeldung";
+ Optional nameOptional = Optional.of(name);
+
+ int len = nameOptional.map(String::length).orElse(0);
+ assertEquals(8, len);
+ }
+
+ @Test
+ public void givenOptional_whenMapWorksWithFilter_thenCorrect() {
+ String password = " password ";
+ Optional passOpt = Optional.of(password);
+ boolean correctPassword = passOpt.filter(pass -> pass.equals("password")).isPresent();
+ assertFalse(correctPassword);
+
+ correctPassword = passOpt.map(String::trim).filter(pass -> pass.equals("password")).isPresent();
+ assertTrue(correctPassword);
+ }
+
+ // Transforming Value With flatMap()
+ @Test
+ public void givenOptional_whenFlatMapWorks_thenCorrect2() {
+ Person person = new Person("john", 26);
+ Optional personOptional = Optional.of(person);
+
+ Optional> nameOptionalWrapper = personOptional.map(Person::getName);
+ Optional nameOptional = nameOptionalWrapper.orElseThrow(IllegalArgumentException::new);
+ String name1 = nameOptional.orElseThrow(IllegalArgumentException::new);
+ assertEquals("john", name1);
+
+ String name = personOptional.flatMap(Person::getName).orElseThrow(IllegalArgumentException::new);
+ assertEquals("john", name);
+ }
+
+ @Test
+ public void givenOptional_whenFlatMapWorksWithFilter_thenCorrect() {
+ Person person = new Person("john", 26);
+ person.setPassword("password");
+ Optional personOptional = Optional.of(person);
+
+ String password = personOptional.flatMap(Person::getPassword).filter(cleanPass -> cleanPass.equals("password")).orElseThrow(IllegalArgumentException::new);
+ assertEquals("password", password);
+ }
+
+ // Default Value With orElse
+ @Test
+ public void whenOrElseWorks_thenCorrect() {
+ String nullName = null;
+ String name = Optional.ofNullable(nullName).orElse("john");
+ assertEquals("john", name);
+ }
+
+ // Default Value With orElseGet
+ @Test
+ public void whenOrElseGetWorks_thenCorrect() {
+ String nullName = null;
+ String name = Optional.ofNullable(nullName).orElseGet(() -> "john");
+ assertEquals("john", name);
+
+ }
+
+ @Test
+ public void whenOrElseGetAndOrElseOverlap_thenCorrect() {
+ String text = null;
+ System.out.println("Using orElseGet:");
+ String defaultText = Optional.ofNullable(text).orElseGet(this::getMyDefault);
+ assertEquals("Default Value", defaultText);
+
+ System.out.println("Using orElse:");
+ defaultText = Optional.ofNullable(text).orElse(getMyDefault());
+ assertEquals("Default Value", defaultText);
+ }
+
+ @Test
+ public void whenOrElseGetAndOrElseDiffer_thenCorrect() {
+ String text = "Text present";
+ System.out.println("Using orElseGet:");
+ String defaultText = Optional.ofNullable(text).orElseGet(this::getMyDefault);
+ assertEquals("Text present", defaultText);
+
+ System.out.println("Using orElse:");
+ defaultText = Optional.ofNullable(text).orElse(getMyDefault());
+ assertEquals("Text present", defaultText);
+ }
+
+ // Exceptions With orElseThrow
+ @Test(expected = IllegalArgumentException.class)
+ public void whenOrElseThrowWorks_thenCorrect() {
+ String nullName = null;
+ String name = Optional.ofNullable(nullName).orElseThrow(IllegalArgumentException::new);
+ }
+
+ public String getMyDefault() {
+ System.out.println("Getting default value...");
+ return "Default Value";
+ }
+}
diff --git a/core-java/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java b/core-java/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java
index 3ee08767bd..0d913db1bd 100644
--- a/core-java/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java
+++ b/core-java/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java
@@ -1,21 +1,15 @@
package org.baeldung.java.collections;
-import static java.util.Arrays.asList;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import org.junit.Assert;
-import org.junit.Test;
-
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static java.util.Arrays.asList;
public class CollectionsConcatenateUnitTest {
@@ -63,16 +57,16 @@ public class CollectionsConcatenateUnitTest {
Assert.assertEquals(Arrays.asList("S", "T", "U", "V"), collectionCombined);
}
- public static Iterable concat(Iterable extends E> list1, Iterable extends E> list2) {
+ public static Iterable concat(Iterable extends E> i1, Iterable extends E> i2) {
return new Iterable() {
public Iterator iterator() {
return new Iterator() {
- protected Iterator extends E> listIterator = list1.iterator();
- protected Boolean checkedHasNext;
- protected E nextValue;
+ Iterator extends E> listIterator = i1.iterator();
+ Boolean checkedHasNext;
+ E nextValue;
private boolean startTheSecond;
- public void theNext() {
+ void theNext() {
if (listIterator.hasNext()) {
checkedHasNext = true;
nextValue = listIterator.next();
@@ -80,7 +74,7 @@ public class CollectionsConcatenateUnitTest {
checkedHasNext = false;
else {
startTheSecond = true;
- listIterator = list2.iterator();
+ listIterator = i2.iterator();
theNext();
}
}
@@ -107,7 +101,7 @@ public class CollectionsConcatenateUnitTest {
}
public static List makeListFromIterable(Iterable iter) {
- List list = new ArrayList();
+ List list = new ArrayList<>();
for (E item : iter) {
list.add(item);
}
diff --git a/core-java/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java b/core-java/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java
new file mode 100644
index 0000000000..78f79f646b
--- /dev/null
+++ b/core-java/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java
@@ -0,0 +1,154 @@
+package org.baeldung.java.collections;
+
+import org.junit.Test;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.junit.Assert.*;
+
+public class JoinSplitCollectionsUnitTest {
+
+ @Test
+ public void whenJoiningTwoArrays_thenJoined() {
+ String[] animals1 = new String[] { "Dog", "Cat" };
+ String[] animals2 = new String[] { "Bird", "Cow" };
+ String[] result = Stream.concat(Arrays.stream(animals1), Arrays.stream(animals2)).toArray(String[]::new);
+
+ assertArrayEquals(result, new String[] { "Dog", "Cat", "Bird", "Cow" });
+ }
+
+ @Test
+ public void whenJoiningTwoCollections_thenJoined() {
+ Collection collection1 = Arrays.asList(7, 8, 9);
+ Collection collection2 = Arrays.asList(10, 11, 12);
+ Collection result = Stream.concat(collection1.stream(), collection2.stream()).collect(Collectors.toList());
+
+ assertTrue(result.equals(Arrays.asList(7, 8, 9, 10, 11, 12)));
+ }
+
+ @Test
+ public void whenJoiningTwoCollectionsWithFilter_thenJoined() {
+ Collection collection1 = Arrays.asList(7, 8, 11);
+ Collection collection2 = Arrays.asList(9, 12, 10);
+ Collection result = Stream.concat(collection1.stream(), collection2.stream()).filter(next -> next <= 10).collect(Collectors.toList());
+
+ assertTrue(result.equals(Arrays.asList(7, 8, 9, 10)));
+ }
+
+ @Test
+ public void whenConvertArrayToString_thenConverted() {
+ String[] colors = new String[] { "Red", "Blue", "Green", "Yellow" };
+ String result = Arrays.stream(colors).collect(Collectors.joining(", "));
+
+ assertEquals(result, "Red, Blue, Green, Yellow");
+ }
+
+ @Test
+ public void whenConvertCollectionToString_thenConverted() {
+ Collection directions = Arrays.asList("Left", "Right", "Top", "Bottom");
+ String result = directions.stream().collect(Collectors.joining(", "));
+
+ assertEquals(result, "Left, Right, Top, Bottom");
+ }
+
+ @Test
+ public void whenConvertMapToString_thenConverted() {
+ Map users = new HashMap<>();
+ users.put(1, "John Doe");
+ users.put(2, "Paul Smith");
+ users.put(3, "Susan Anderson");
+
+ String result = users.entrySet().stream().map(entry -> entry.getKey() + " = " + entry.getValue()).collect(Collectors.joining(", "));
+
+ assertEquals(result, "1 = John Doe, 2 = Paul Smith, 3 = Susan Anderson");
+ }
+
+ @Test
+ public void whenConvertNestedCollectionToString_thenConverted() {
+ Collection> nested = new ArrayList<>();
+ nested.add(Arrays.asList("Left", "Right", "Top", "Bottom"));
+ nested.add(Arrays.asList("Red", "Blue", "Green", "Yellow"));
+
+ String result = nested.stream().map(nextList -> nextList.stream().collect(Collectors.joining("-"))).collect(Collectors.joining("; "));
+
+ assertEquals(result, "Left-Right-Top-Bottom; Red-Blue-Green-Yellow");
+ }
+
+ @Test
+ public void whenConvertCollectionToStringAndSkipNull_thenConverted() {
+ Collection fruits = Arrays.asList("Apple", "Orange", null, "Grape");
+ String result = fruits.stream().filter(Objects::nonNull).collect(Collectors.joining(", "));
+
+ assertEquals(result, "Apple, Orange, Grape");
+ }
+
+ @Test
+ public void whenSplitCollectionHalf_thenConverted() {
+ Collection numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+ Collection result1 = new ArrayList<>();
+ Collection result2 = new ArrayList<>();
+ AtomicInteger count = new AtomicInteger();
+ int midpoint = Math.round(numbers.size() / 2);
+
+ numbers.forEach(next -> {
+ int index = count.getAndIncrement();
+ if (index < midpoint) {
+ result1.add(next);
+ } else {
+ result2.add(next);
+ }
+ });
+
+ assertTrue(result1.equals(Arrays.asList(1, 2, 3, 4, 5)));
+ assertTrue(result2.equals(Arrays.asList(6, 7, 8, 9, 10)));
+ }
+
+ @Test
+ public void whenSplitArrayByWordLength_thenConverted() {
+ String[] words = new String[] { "bye", "cold", "it", "and", "my", "word" };
+ Map> result = Arrays.stream(words).collect(Collectors.groupingBy(String::length));
+
+ assertTrue(result.get(2).equals(Arrays.asList("it", "my")));
+ assertTrue(result.get(3).equals(Arrays.asList("bye", "and")));
+ assertTrue(result.get(4).equals(Arrays.asList("cold", "word")));
+ }
+
+ @Test
+ public void whenConvertStringToArray_thenConverted() {
+ String colors = "Red, Blue, Green, Yellow";
+ String[] result = colors.split(", ");
+
+ assertArrayEquals(result, new String[] { "Red", "Blue", "Green", "Yellow" });
+ }
+
+ @Test
+ public void whenConvertStringToCollection_thenConverted() {
+ String colors = "Left, Right, Top, Bottom";
+ Collection result = Arrays.asList(colors.split(", "));
+
+ assertTrue(result.equals(Arrays.asList("Left", "Right", "Top", "Bottom")));
+ }
+
+ @Test
+ public void whenConvertStringToMap_thenConverted() {
+ String users = "1 = John Doe, 2 = Paul Smith, 3 = Susan Anderson";
+
+ Map result = Arrays.stream(users.split(", ")).map(next -> next.split(" = ")).collect(Collectors.toMap(entry -> Integer.parseInt(entry[0]), entry -> entry[1]));
+
+ assertEquals(result.get(1), "John Doe");
+ assertEquals(result.get(2), "Paul Smith");
+ assertEquals(result.get(3), "Susan Anderson");
+ }
+
+ @Test
+ public void whenConvertCollectionToStringMultipleSeparators_thenConverted() {
+ String fruits = "Apple. , Orange, Grape. Lemon";
+
+ Collection result = Arrays.stream(fruits.split("[,|.]")).map(String::trim).filter(next -> !next.isEmpty()).collect(Collectors.toList());
+
+ assertTrue(result.equals(Arrays.asList("Apple", "Orange", "Grape", "Lemon")));
+ }
+}
diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaFileUnitTest.java b/core-java/src/test/java/org/baeldung/java/io/JavaFileUnitTest.java
index d4b63beaa4..6d972611f1 100644
--- a/core-java/src/test/java/org/baeldung/java/io/JavaFileUnitTest.java
+++ b/core-java/src/test/java/org/baeldung/java/io/JavaFileUnitTest.java
@@ -20,7 +20,6 @@ public class JavaFileUnitTest {
private static final String TEMP_DIR = "src/test/resources/temp" + UUID.randomUUID().toString();
-
@BeforeClass
public static void setup() throws IOException {
Files.createDirectory(Paths.get(TEMP_DIR));
diff --git a/core-java/src/test/java/org/baeldung/java/sorting/Employee.java b/core-java/src/test/java/org/baeldung/java/sorting/Employee.java
new file mode 100644
index 0000000000..477092bfcb
--- /dev/null
+++ b/core-java/src/test/java/org/baeldung/java/sorting/Employee.java
@@ -0,0 +1,55 @@
+package org.baeldung.java.sorting;
+
+public class Employee implements Comparable {
+
+ private String name;
+ private int age;
+ private double salary;
+
+ public Employee(String name, int age, double salary) {
+ this.name = name;
+ this.age = age;
+ this.salary = salary;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public double getSalary() {
+ return salary;
+ }
+
+ public void setSalary(double salary) {
+ this.salary = salary;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return ((Employee) obj).getName().equals(getName());
+ }
+
+ @Override
+ public int compareTo(Object o) {
+ Employee e = (Employee) o;
+ return getName().compareTo(e.getName());
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuffer().append("(").append(getName()).append(getAge()).append(",").append(getSalary()).append(")").toString();
+ }
+
+}
diff --git a/core-java/src/test/java/org/baeldung/java/sorting/JavaSorting.java b/core-java/src/test/java/org/baeldung/java/sorting/JavaSorting.java
new file mode 100644
index 0000000000..72730aeb8b
--- /dev/null
+++ b/core-java/src/test/java/org/baeldung/java/sorting/JavaSorting.java
@@ -0,0 +1,186 @@
+package org.baeldung.java.sorting;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.primitives.Ints;
+
+public class JavaSorting {
+
+ private int[] toSort;
+ private int[] sortedInts;
+ private int[] sortedRangeInts;
+ // private Integer [] integers;
+ // private Integer [] sortedIntegers;
+ // private List integersList;
+ // private List sortedIntegersList;
+ private Employee[] employees;
+ private Employee[] employeesSorted;
+ private Employee[] employeesSortedByAge;
+ private HashMap map;
+
+ @Before
+ public void initVariables() {
+
+ toSort = new int[] { 5, 1, 89, 255, 7, 88, 200, 123, 66 };
+ sortedInts = new int[] { 1, 5, 7, 66, 88, 89, 123, 200, 255 };
+ sortedRangeInts = new int[] { 5, 1, 89, 7, 88, 200, 255, 123, 66 };
+
+ // integers = new Integer[]
+ // { 5, 1, 89, 255, 7, 88, 200, 123, 66 };
+ // sortedIntegers = new Integer[]
+ // {1, 5, 7, 66, 88, 89, 123, 200, 255};
+ //
+ // integersList = Arrays.asList(new Integer[] { 5, 1, 89, 255, 7, 88, 200, 123, 66 });
+ // sortedIntegersList = Arrays.asList(new Integer[] {1, 5, 7, 66, 88, 89, 123, 200, 255});
+
+ employees = new Employee[] { new Employee("John", 23, 5000), new Employee("Steve", 26, 6000), new Employee("Frank", 33, 7000), new Employee("Earl", 43, 10000), new Employee("Jessica", 23, 4000), new Employee("Pearl", 33, 6000) };
+ employeesSorted = new Employee[] { new Employee("Earl", 43, 10000), new Employee("Frank", 33, 70000), new Employee("Jessica", 23, 4000), new Employee("John", 23, 5000), new Employee("Pearl", 33, 4000), new Employee("Steve", 26, 6000) };
+ employeesSortedByAge = new Employee[] { new Employee("John", 23, 5000), new Employee("Jessica", 23, 4000), new Employee("Steve", 26, 6000), new Employee("Frank", 33, 70000), new Employee("Pearl", 33, 4000), new Employee("Earl", 43, 10000) };
+
+ HashMap map = new HashMap<>();
+ map.put(55, "John");
+ map.put(22, "Apple");
+ map.put(66, "Earl");
+ map.put(77, "Pearl");
+ map.put(12, "George");
+ map.put(6, "Rocky");
+
+ }
+
+ @Test
+ public void givenIntArray_whenUsingSort_thenSortedArray() {
+ Arrays.sort(toSort);
+
+ assertTrue(Arrays.equals(toSort, sortedInts));
+ }
+
+ @Test
+ public void givenIntegerArray_whenUsingSort_thenSortedArray() {
+ Integer[] integers = ArrayUtils.toObject(toSort);
+ Arrays.sort(integers, new Comparator() {
+ @Override
+ public int compare(Integer a, Integer b) {
+ return a - b;
+ }
+ });
+
+ assertTrue(Arrays.equals(integers, ArrayUtils.toObject(sortedInts)));
+ }
+
+ @Test
+ public void givenArray_whenUsingSortWithLambdas_thenSortedArray() {
+ Integer[] integersToSort = ArrayUtils.toObject(toSort);
+ Arrays.sort(integersToSort, (a, b) -> {
+ return a - b;
+ });
+
+ assertTrue(Arrays.equals(integersToSort, ArrayUtils.toObject(sortedInts)));
+ }
+
+ @Test
+ public void givenEmpArray_SortEmpArray_thenSortedArrayinNaturalOrder() {
+ Arrays.sort(employees);
+
+ assertTrue(Arrays.equals(employees, employeesSorted));
+ }
+
+ @Test
+ public void givenIntArray_whenUsingRangeSort_thenRangeSortedArray() {
+ Arrays.sort(toSort, 3, 7);
+
+ assertTrue(Arrays.equals(toSort, sortedRangeInts));
+ }
+
+ @Test
+ public void givenIntArray_whenUsingParallelSort_thenArraySorted() {
+ Arrays.parallelSort(toSort);
+
+ assertTrue(Arrays.equals(toSort, sortedInts));
+ }
+
+ @Test
+ public void givenArrayObjects_whenUsingComparing_thenSortedArrayObjects() {
+ List employeesList = Arrays.asList(employees);
+
+ employeesList.sort(Comparator.comparing(Employee::getAge));// .thenComparing(Employee::getName));
+
+ assertTrue(Arrays.equals(employeesList.toArray(), employeesSortedByAge));
+ }
+
+ @Test
+ public void givenList_whenUsingSort_thenSortedList() {
+ List toSortList = Ints.asList(toSort);
+ Collections.sort(toSortList);
+
+ assertTrue(Arrays.equals(toSortList.toArray(), ArrayUtils.toObject(sortedInts)));
+ }
+
+ @Test
+ public void givenMap_whenSortingByKeys_thenSortedMap() {
+ Integer[] sortedKeys = new Integer[] { 6, 12, 22, 55, 66, 77 };
+
+ List> entries = new ArrayList<>(map.entrySet());
+ Collections.sort(entries, new Comparator>() {
+ @Override
+ public int compare(Entry o1, Entry o2) {
+ return o1.getKey().compareTo(o2.getKey());
+ }
+ });
+ HashMap sortedMap = new LinkedHashMap<>();
+ for (Map.Entry entry : entries) {
+ sortedMap.put(entry.getKey(), entry.getValue());
+ }
+
+ assertTrue(Arrays.equals(sortedMap.keySet().toArray(), sortedKeys));
+ }
+
+ @Test
+ public void givenMap_whenSortingByValues_thenSortedMap() {
+ String[] sortedValues = new String[] { "Apple", "Earl", "George", "John", "Pearl", "Rocky" };
+
+ List> entries = new ArrayList<>(map.entrySet());
+ Collections.sort(entries, new Comparator>() {
+ @Override
+ public int compare(Entry o1, Entry o2) {
+ return o1.getValue().compareTo(o2.getValue());
+ }
+ });
+ HashMap sortedMap = new LinkedHashMap<>();
+ for (Map.Entry entry : entries) {
+ sortedMap.put(entry.getKey(), entry.getValue());
+ }
+
+ assertTrue(Arrays.equals(sortedMap.values().toArray(), sortedValues));
+ }
+
+ @Test
+ public void givenSet_whenUsingSort_thenSortedSet() {
+ HashSet integersSet = new LinkedHashSet<>(Ints.asList(toSort));
+ HashSet descSortedIntegersSet = new LinkedHashSet<>(Arrays.asList(new Integer[] { 255, 200, 123, 89, 88, 66, 7, 5, 1 }));
+
+ ArrayList list = new ArrayList(integersSet);
+ Collections.sort(list, (i1, i2) -> {
+ return i2 - i1;
+ });
+ integersSet = new LinkedHashSet<>(list);
+
+ assertTrue(Arrays.equals(integersSet.toArray(), descSortedIntegersSet.toArray()));
+ }
+
+}
diff --git a/core-java/src/test/resources/file.txt b/core-java/src/test/resources/file.txt
new file mode 100644
index 0000000000..558d8bbf35
--- /dev/null
+++ b/core-java/src/test/resources/file.txt
@@ -0,0 +1 @@
+baeldung.com
\ No newline at end of file
diff --git a/jackson-annotations/pom.xml b/jackson-annotations/pom.xml
new file mode 100644
index 0000000000..4da0522a5b
--- /dev/null
+++ b/jackson-annotations/pom.xml
@@ -0,0 +1,235 @@
+
+ 4.0.0
+
+ com.baeldung
+ jackson-annotations
+ 1.0-SNAPSHOT
+ jar
+
+ jackson-annotations
+
+
+
+
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-xml
+ ${jackson.version}
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+ ${jackson.version}
+
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-joda
+ ${jackson.version}
+
+
+
+ com.fasterxml.jackson.module
+ jackson-module-jsonSchema
+ ${jackson.version}
+
+
+
+ joda-time
+ joda-time
+ ${joda-time.version}
+
+
+
+ com.google.code.gson
+ gson
+ ${gson.version}
+
+
+
+
+
+ io.rest-assured
+ rest-assured
+ 3.0.1
+ test
+
+
+
+ io.rest-assured
+ json-schema-validator
+ 3.0.0
+ test
+
+
+
+ io.rest-assured
+ json-path
+ 3.0.1
+ test
+
+
+
+ com.github.fge
+ json-schema-validator
+ 2.2.6
+ test
+
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
+ org.assertj
+ assertj-core
+ 3.6.1
+ test
+
+
+
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+
+
+
+ org.slf4j
+ jcl-over-slf4j
+ ${org.slf4j.version}
+
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${org.slf4j.version}
+
+
+
+
+
+ jackson
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven-compiler-plugin.source}
+ ${maven-compiler-plugin.source}
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+
+
+
+
+
+
+
+
+ 4.3.11.Final
+ 5.1.38
+
+
+ 2.8.5
+
+
+ 1.7.21
+ 1.1.7
+
+
+ 5.1.3.Final
+ 2.9.6
+ 2.8.0
+ 4.1
+
+
+ 20.0
+ 3.5
+ 2.5
+
+
+ 1.3
+ 4.12
+ 2.2.26
+
+ 4.4.1
+ 4.5
+
+ 2.9.0
+
+
+ 3.5.1
+ 2.6
+ 2.19.1
+ 2.7
+ 1.4.18
+
+ UTF-8
+ 1.8
+
+
+
+
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jacksoninject/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jacksoninject/Author.java
new file mode 100644
index 0000000000..2d816282b2
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jacksoninject/Author.java
@@ -0,0 +1,32 @@
+package com.baeldung.jacksonannotation.deserialization.jacksoninject;
+
+import com.baeldung.jacksonannotation.domain.Item;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Author extends Person {
+
+ List- items = new ArrayList<>();
+
+ public Author(){
+ super();
+ }
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jacksoninject/Person.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jacksoninject/Person.java
new file mode 100644
index 0000000000..f7e44b3dd4
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jacksoninject/Person.java
@@ -0,0 +1,49 @@
+package com.baeldung.jacksonannotation.deserialization.jacksoninject;
+
+import com.fasterxml.jackson.annotation.JacksonInject;
+
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Person {
+
+ @JacksonInject
+ private UUID id;
+ private String firstName;
+ private String lastName;
+
+ public Person(){
+
+ }
+
+ public Person(String firstName, String lastName) {
+ this.id = UUID.randomUUID();
+ this.firstName = firstName;
+ this.lastName = lastName;
+ }
+
+ 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 UUID getId() {
+ return id;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsonanysetter/Inventory.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsonanysetter/Inventory.java
new file mode 100644
index 0000000000..22b1540896
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsonanysetter/Inventory.java
@@ -0,0 +1,38 @@
+package com.baeldung.jacksonannotation.deserialization.jsonanysetter;
+
+import com.baeldung.jacksonannotation.domain.Author;
+import com.baeldung.jacksonannotation.domain.Item;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ * @see JsonAnyGetter
+ */
+public class Inventory {
+
+ private Map stock = new HashMap<>();
+
+ private Map countryDeliveryCost = new HashMap<>();
+
+ @JsonIgnore
+ public Map getStock() {
+ return stock;
+ }
+
+ public Map getCountryDeliveryCost() {
+ return countryDeliveryCost;
+ }
+
+ @JsonAnySetter
+ public void addCountryDeliveryCost(String country, Float cost) {
+ countryDeliveryCost.put(country, cost);
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsoncreator/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsoncreator/Author.java
new file mode 100644
index 0000000000..c9ed3eaf47
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsoncreator/Author.java
@@ -0,0 +1,38 @@
+package com.baeldung.jacksonannotation.deserialization.jsoncreator;
+
+
+import com.baeldung.jacksonannotation.domain.Item;
+import com.baeldung.jacksonannotation.domain.Person;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonGetter;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ * @see JsonGetter
+ */
+public class Author extends Person {
+
+ List
- items = new ArrayList<>();
+
+ @JsonCreator
+ public Author(
+ @JsonProperty("christianName") String firstName,
+ @JsonProperty("surname") String lastName) {
+ super(firstName, lastName);
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/Author.java
new file mode 100644
index 0000000000..5830d099e1
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/Author.java
@@ -0,0 +1,30 @@
+package com.baeldung.jacksonannotation.deserialization.jsondeserialize;
+
+import com.baeldung.jacksonannotation.domain.Item;
+import com.baeldung.jacksonannotation.domain.Person;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Author extends Person {
+
+ List
- items = new ArrayList<>();
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/Book.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/Book.java
new file mode 100644
index 0000000000..eb2c1c967c
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/Book.java
@@ -0,0 +1,53 @@
+package com.baeldung.jacksonannotation.deserialization.jsondeserialize;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Book extends Item {
+
+ private String ISBN;
+
+ @JsonDeserialize(using = CustomDateDeserializer.class)
+ private Date published;
+ private BigDecimal pages;
+
+ public Book() {
+ super();
+ }
+
+ public Book(String title, Author author) {
+ super(title, author);
+ }
+
+ public String getISBN() {
+ return ISBN;
+ }
+
+ public void setISBN(String ISBN) {
+ this.ISBN = ISBN;
+ }
+
+ public Date getPublished() {
+ return published;
+ }
+
+ public void setPublished(Date published) {
+ this.published = published;
+ }
+
+ public BigDecimal getPages() {
+ return pages;
+ }
+
+ public void setPages(BigDecimal pages) {
+ this.pages = pages;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/CustomDateDeserializer.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/CustomDateDeserializer.java
new file mode 100644
index 0000000000..c8ad9979ab
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/CustomDateDeserializer.java
@@ -0,0 +1,42 @@
+package com.baeldung.jacksonannotation.deserialization.jsondeserialize;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class CustomDateDeserializer extends StdDeserializer {
+
+ private static SimpleDateFormat formatter =
+ new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
+
+ public CustomDateDeserializer() {
+ this(null);
+ }
+
+ public CustomDateDeserializer(Class> vc) {
+ super(vc);
+ }
+
+ @Override
+ public Date deserialize(JsonParser jsonparser, DeserializationContext context)
+ throws IOException, JsonProcessingException {
+ String date = jsonparser.getText();
+ try {
+ return formatter.parse(date);
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/Item.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/Item.java
new file mode 100644
index 0000000000..3d2fba74e2
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/Item.java
@@ -0,0 +1,61 @@
+package com.baeldung.jacksonannotation.deserialization.jsondeserialize;
+
+import com.baeldung.jacksonannotation.domain.Person;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Item {
+
+ private UUID id;
+ private String title;
+ private List authors = new ArrayList<>();
+ private float price;
+
+ public Item(){}
+
+ public Item(String title, Author author) {
+ this.id = UUID.randomUUID();
+ this.title = title;
+ this.authors.add(author);
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public void setId(UUID id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public List getAuthors() {
+ return authors;
+ }
+
+ public void setAuthors(List authors) {
+ this.authors = authors;
+ }
+
+ public float getPrice() {
+ return price;
+ }
+
+ public void setPrice(float price) {
+ this.price = price;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsonsetter/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsonsetter/Author.java
new file mode 100644
index 0000000000..534984f731
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/deserialization/jsonsetter/Author.java
@@ -0,0 +1,38 @@
+package com.baeldung.jacksonannotation.deserialization.jsonsetter;
+
+import com.baeldung.jacksonannotation.domain.Item;
+import com.baeldung.jacksonannotation.domain.Person;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonSetter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Author extends Person {
+
+ private List
- items = new ArrayList<>();
+
+ public Author(){
+ super();
+ }
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ @JsonIgnore
+ public List
- getItems() {
+ return items;
+ }
+
+ @JsonSetter("publications")
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Author.java
new file mode 100644
index 0000000000..cee1576a79
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Author.java
@@ -0,0 +1,27 @@
+package com.baeldung.jacksonannotation.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Author extends Person {
+
+ private List
- items = new ArrayList<>();
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Book.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Book.java
new file mode 100644
index 0000000000..82980673f1
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Book.java
@@ -0,0 +1,48 @@
+package com.baeldung.jacksonannotation.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Book extends Item {
+
+ private String ISBN;
+ private Date published;
+ private BigDecimal pages;
+
+ public Book(){
+ }
+
+ public Book(String title, Author author) {
+ super(title, author);
+ }
+
+ public String getISBN() {
+ return ISBN;
+ }
+
+ public void setISBN(String ISBN) {
+ this.ISBN = ISBN;
+ }
+
+ public Date getPublished() {
+ return published;
+ }
+
+ public void setPublished(Date published) {
+ this.published = published;
+ }
+
+ public BigDecimal getPages() {
+ return pages;
+ }
+
+ public void setPages(BigDecimal pages) {
+ this.pages = pages;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Course.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Course.java
new file mode 100644
index 0000000000..6f0f55dc28
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Course.java
@@ -0,0 +1,71 @@
+package com.baeldung.jacksonannotation.domain;
+
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Course extends Item {
+
+ public enum Medium {CLASSROOM, ONLINE}
+
+ public enum Level {
+ BEGINNER("Beginner", 1), INTERMEDIATE("Intermediate", 2), ADVANCED("Advanced", 3);
+
+ private String name;
+ private int number;
+
+ Level(String name, int number) {
+ this.name = name;
+ this.number = number;
+ }
+
+ public String getName() {
+ return name;
+ }
+ }
+
+ private float duration;
+ private Medium medium;
+ private Level level;
+ private List prerequisite;
+
+ public Course(String title, Author author) {
+ super(title, author);
+ }
+
+ public float getDuration() {
+ return duration;
+ }
+
+ public void setDuration(float duration) {
+ this.duration = duration;
+ }
+
+ public Medium getMedium() {
+ return medium;
+ }
+
+ public void setMedium(Medium medium) {
+ this.medium = medium;
+ }
+
+ public Level getLevel() {
+ return level;
+ }
+
+ public void setLevel(Level level) {
+ this.level = level;
+ }
+
+ public List getPrerequisite() {
+ return prerequisite;
+ }
+
+ public void setPrerequisite(List prerequisite) {
+ this.prerequisite = prerequisite;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Customer.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Customer.java
new file mode 100644
index 0000000000..0cd49f7934
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Customer.java
@@ -0,0 +1,24 @@
+package com.baeldung.jacksonannotation.domain;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Customer extends Person {
+
+ private String configuration;
+
+ public Customer(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public String getConfiguration() {
+ return configuration;
+ }
+
+ public void setConfiguration(String configuration) {
+ this.configuration = configuration;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Inventory.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Inventory.java
new file mode 100644
index 0000000000..e17d2ab406
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Inventory.java
@@ -0,0 +1,29 @@
+package com.baeldung.jacksonannotation.domain;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Inventory {
+
+ private Map stock;
+
+ private Map countryDeliveryCost = new HashMap<>();
+
+ public Map getStock() {
+ return stock;
+ }
+
+ public void setStock(Map stock) {
+ this.stock = stock;
+ }
+
+ public Map getCountryDeliveryCost() {
+ return countryDeliveryCost;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Item.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Item.java
new file mode 100644
index 0000000000..a45d99f660
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Item.java
@@ -0,0 +1,59 @@
+package com.baeldung.jacksonannotation.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Item {
+
+ private UUID id;
+ private String title;
+ private List authors = new ArrayList<>();
+ private float price;
+
+ public Item(){}
+
+ public Item(String title, Author author) {
+ this.id = UUID.randomUUID();
+ this.title = title;
+ this.authors.add(author);
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public void setId(UUID id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public List getAuthors() {
+ return authors;
+ }
+
+ public void setAuthors(List authors) {
+ this.authors = authors;
+ }
+
+ public float getPrice() {
+ return price;
+ }
+
+ public void setPrice(float price) {
+ this.price = price;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Order.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Order.java
new file mode 100644
index 0000000000..614a8921e3
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Order.java
@@ -0,0 +1,50 @@
+package com.baeldung.jacksonannotation.domain;
+
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Order {
+
+ private UUID id;
+ private Type type;
+ private int internalAudit;
+
+ public static class Type {
+ public long id;
+ public String name;
+ }
+
+ public Order() {
+ this.id = UUID.randomUUID();
+ }
+
+ public Order(Type type) {
+ this();
+ this.type = type;
+ }
+
+ public Order(int internalAudit) {
+ this();
+ this.type = new Type();
+ this.type.id = 20;
+ this.type.name = "Order";
+ this.internalAudit = internalAudit;
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public Type getType() {
+ return type;
+ }
+
+ public void setType(Type type) {
+ this.type = type;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Person.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Person.java
new file mode 100644
index 0000000000..9189b20662
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/domain/Person.java
@@ -0,0 +1,44 @@
+package com.baeldung.jacksonannotation.domain;
+
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Person {
+
+ private UUID id;
+ private String firstName;
+ private String lastName;
+
+ public Person(){}
+
+ public Person(String firstName, String lastName) {
+ this.id = UUID.randomUUID();
+ this.firstName = firstName;
+ this.lastName = lastName;
+ }
+
+ 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 UUID getId() {
+ return id;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonfilter/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonfilter/Author.java
new file mode 100644
index 0000000000..1c45bf02c1
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonfilter/Author.java
@@ -0,0 +1,32 @@
+package com.baeldung.jacksonannotation.general.jsonfilter;
+
+import com.baeldung.jacksonannotation.domain.Item;
+import com.baeldung.jacksonannotation.domain.Person;
+import com.fasterxml.jackson.annotation.JsonFilter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+@JsonFilter("authorFilter")
+public class Author extends Person {
+
+ private List
- items = new ArrayList<>();
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonformat/Book.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonformat/Book.java
new file mode 100644
index 0000000000..d7f3901be5
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonformat/Book.java
@@ -0,0 +1,56 @@
+package com.baeldung.jacksonannotation.general.jsonformat;
+
+import com.baeldung.jacksonannotation.domain.Author;
+import com.baeldung.jacksonannotation.domain.Item;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Book extends Item {
+
+ private String ISBN;
+
+ @JsonFormat(
+ shape = JsonFormat.Shape.STRING,
+ pattern = "dd-MM-yyyy HH:mm:ss")
+ private Date published;
+ private BigDecimal pages;
+
+ public Book() {
+ }
+
+ public Book(String title, Author author) {
+ super(title, author);
+ }
+
+ public String getISBN() {
+ return ISBN;
+ }
+
+ public void setISBN(String ISBN) {
+ this.ISBN = ISBN;
+ }
+
+ public Date getPublished() {
+ return published;
+ }
+
+ public void setPublished(Date published) {
+ this.published = published;
+ }
+
+ public BigDecimal getPages() {
+ return pages;
+ }
+
+ public void setPages(BigDecimal pages) {
+ this.pages = pages;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/Author.java
new file mode 100644
index 0000000000..1a60af54dc
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/Author.java
@@ -0,0 +1,33 @@
+package com.baeldung.jacksonannotation.general.jsonidentityinfo;
+
+import com.fasterxml.jackson.annotation.JsonIdentityInfo;
+import com.fasterxml.jackson.annotation.ObjectIdGenerators;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+@JsonIdentityInfo(
+ generator = ObjectIdGenerators.PropertyGenerator.class,
+ property = "id")
+public class Author extends Person {
+
+ private List
- items = new ArrayList<>();
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/Course.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/Course.java
new file mode 100644
index 0000000000..d7195a91d8
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/Course.java
@@ -0,0 +1,72 @@
+package com.baeldung.jacksonannotation.general.jsonidentityinfo;
+
+
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Course extends Item {
+
+ public enum Medium {CLASSROOM, ONLINE}
+
+ public enum Level {
+ BEGINNER("Beginner", 1), INTERMEDIATE("Intermediate", 2), ADVANCED("Advanced", 3);
+
+ private String name;
+ private int number;
+
+ Level(String name, int number) {
+ this.name = name;
+ this.number = number;
+ }
+
+ public String getName() {
+ return name;
+ }
+ }
+
+ private float duration;
+ private Medium medium;
+ private Level level;
+ private List prerequisite;
+
+ public Course(String title, Author author) {
+ super(title, author);
+ }
+
+ public float getDuration() {
+ return duration;
+ }
+
+ public void setDuration(float duration) {
+ this.duration = duration;
+ }
+
+ public Medium getMedium() {
+ return medium;
+ }
+
+ public void setMedium(Medium medium) {
+ this.medium = medium;
+ }
+
+ public Level getLevel() {
+ return level;
+ }
+
+ public void setLevel(Level level) {
+ this.level = level;
+ }
+
+ public List getPrerequisite() {
+ return prerequisite;
+ }
+
+ public void setPrerequisite(List prerequisite) {
+ this.prerequisite = prerequisite;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/Item.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/Item.java
new file mode 100644
index 0000000000..b5438d4639
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/Item.java
@@ -0,0 +1,65 @@
+package com.baeldung.jacksonannotation.general.jsonidentityinfo;
+
+import com.fasterxml.jackson.annotation.JsonIdentityInfo;
+import com.fasterxml.jackson.annotation.ObjectIdGenerators;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+@JsonIdentityInfo(
+ generator = ObjectIdGenerators.PropertyGenerator.class,
+ property = "id")
+public class Item {
+
+ private UUID id;
+ private String title;
+ private List authors = new ArrayList<>();
+ private float price;
+
+ public Item(){}
+
+ public Item(String title, Author author) {
+ this.id = UUID.randomUUID();
+ this.title = title;
+ this.authors.add(author);
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public void setId(UUID id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public List getAuthors() {
+ return authors;
+ }
+
+ public void setAuthors(List authors) {
+ this.authors = authors;
+ }
+
+ public float getPrice() {
+ return price;
+ }
+
+ public void setPrice(float price) {
+ this.price = price;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/Person.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/Person.java
new file mode 100644
index 0000000000..1cd3c73b0b
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/Person.java
@@ -0,0 +1,44 @@
+package com.baeldung.jacksonannotation.general.jsonidentityinfo;
+
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Person {
+
+ private UUID id;
+ private String firstName;
+ private String lastName;
+
+ public Person(){}
+
+ public Person(String firstName, String lastName) {
+ this.id = UUID.randomUUID();
+ this.firstName = firstName;
+ this.lastName = lastName;
+ }
+
+ 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 UUID getId() {
+ return id;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonproperty/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonproperty/Author.java
new file mode 100644
index 0000000000..7039e60e9b
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonproperty/Author.java
@@ -0,0 +1,29 @@
+package com.baeldung.jacksonannotation.general.jsonproperty;
+
+import com.baeldung.jacksonannotation.domain.Person;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Author extends Person {
+
+ private List
- items = new ArrayList<>();
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonproperty/Book.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonproperty/Book.java
new file mode 100644
index 0000000000..95d3070eba
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonproperty/Book.java
@@ -0,0 +1,61 @@
+package com.baeldung.jacksonannotation.general.jsonproperty;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Book extends Item {
+
+ private String ISBN;
+ private Date published;
+ private BigDecimal pages;
+ private String binding;
+
+ public Book() {
+ }
+
+ public Book(String title, Author author) {
+ super(title, author);
+ }
+
+ public String getISBN() {
+ return ISBN;
+ }
+
+ public void setISBN(String ISBN) {
+ this.ISBN = ISBN;
+ }
+
+ public Date getPublished() {
+ return published;
+ }
+
+ public void setPublished(Date published) {
+ this.published = published;
+ }
+
+ public BigDecimal getPages() {
+ return pages;
+ }
+
+ public void setPages(BigDecimal pages) {
+ this.pages = pages;
+ }
+
+ @JsonProperty("binding")
+ public String coverBinding() {
+ return binding;
+ }
+
+ @JsonProperty("binding")
+ public void configureBinding(String binding) {
+ this.binding = binding;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonproperty/Item.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonproperty/Item.java
new file mode 100644
index 0000000000..510adaa599
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonproperty/Item.java
@@ -0,0 +1,61 @@
+package com.baeldung.jacksonannotation.general.jsonproperty;
+
+import com.baeldung.jacksonannotation.domain.Person;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Item {
+
+ private UUID id;
+ private String title;
+ private List authors = new ArrayList<>();
+ private float price;
+
+ public Item(){}
+
+ public Item(String title, Author author) {
+ this.id = UUID.randomUUID();
+ this.title = title;
+ this.authors.add(author);
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public void setId(UUID id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public List getAuthors() {
+ return authors;
+ }
+
+ public void setAuthors(List authors) {
+ this.authors = authors;
+ }
+
+ public float getPrice() {
+ return price;
+ }
+
+ public void setPrice(float price) {
+ this.price = price;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonunwrapped/Order.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonunwrapped/Order.java
new file mode 100644
index 0000000000..8393473a2c
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonunwrapped/Order.java
@@ -0,0 +1,54 @@
+package com.baeldung.jacksonannotation.general.jsonunwrapped;
+
+import com.fasterxml.jackson.annotation.JsonUnwrapped;
+
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Order {
+
+ private UUID id;
+
+ @JsonUnwrapped
+ private Type type;
+ private int internalAudit;
+
+ public static class Type {
+ public long id;
+ public String name;
+ }
+
+ public Order() {
+ this.id = UUID.randomUUID();
+ }
+
+ public Order(Type type) {
+ this();
+ this.type = type;
+ }
+
+ public Order(int internalAudit) {
+ this();
+ this.type = new Type();
+ this.type.id = 20;
+ this.type.name = "Order";
+ this.internalAudit = internalAudit;
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public Type getType() {
+ return type;
+ }
+
+ public void setType(Type type) {
+ this.type = type;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonview/Order.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonview/Order.java
new file mode 100644
index 0000000000..f9aa4fc768
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonview/Order.java
@@ -0,0 +1,57 @@
+package com.baeldung.jacksonannotation.general.jsonview;
+
+import com.fasterxml.jackson.annotation.JsonView;
+
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Order {
+
+ @JsonView(Views.Public.class)
+ private UUID id;
+
+ @JsonView(Views.Public.class)
+ private Type type;
+
+ @JsonView(Views.Internal.class)
+ private int internalAudit;
+
+ public static class Type {
+ public long id;
+ public String name;
+ }
+
+ public Order() {
+ this.id = UUID.randomUUID();
+ }
+
+ public Order(Type type) {
+ this();
+ this.type = type;
+ }
+
+ public Order(int internalAudit) {
+ this();
+ this.type = new Type();
+ this.type.id = 20;
+ this.type.name = "Order";
+ this.internalAudit = internalAudit;
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public Type getType() {
+ return type;
+ }
+
+ public void setType(Type type) {
+ this.type = type;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonview/Views.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonview/Views.java
new file mode 100644
index 0000000000..116e212295
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/jsonview/Views.java
@@ -0,0 +1,15 @@
+package com.baeldung.jacksonannotation.general.jsonview;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Views {
+ public static class Public {
+ }
+
+ public static class Internal extends Public {
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/reference/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/reference/Author.java
new file mode 100644
index 0000000000..7c7c8c0a68
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/reference/Author.java
@@ -0,0 +1,30 @@
+package com.baeldung.jacksonannotation.general.reference;
+
+import com.fasterxml.jackson.annotation.JsonManagedReference;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Author extends Person {
+
+ private List
- items = new ArrayList<>();
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ @JsonManagedReference
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/reference/Course.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/reference/Course.java
new file mode 100644
index 0000000000..6fb7251d68
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/reference/Course.java
@@ -0,0 +1,72 @@
+package com.baeldung.jacksonannotation.general.reference;
+
+
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Course extends Item {
+
+ public enum Medium {CLASSROOM, ONLINE}
+
+ public enum Level {
+ BEGINNER("Beginner", 1), INTERMEDIATE("Intermediate", 2), ADVANCED("Advanced", 3);
+
+ private String name;
+ private int number;
+
+ Level(String name, int number) {
+ this.name = name;
+ this.number = number;
+ }
+
+ public String getName() {
+ return name;
+ }
+ }
+
+ private float duration;
+ private Medium medium;
+ private Level level;
+ private List prerequisite;
+
+ public Course(String title, Author author) {
+ super(title, author);
+ }
+
+ public float getDuration() {
+ return duration;
+ }
+
+ public void setDuration(float duration) {
+ this.duration = duration;
+ }
+
+ public Medium getMedium() {
+ return medium;
+ }
+
+ public void setMedium(Medium medium) {
+ this.medium = medium;
+ }
+
+ public Level getLevel() {
+ return level;
+ }
+
+ public void setLevel(Level level) {
+ this.level = level;
+ }
+
+ public List getPrerequisite() {
+ return prerequisite;
+ }
+
+ public void setPrerequisite(List prerequisite) {
+ this.prerequisite = prerequisite;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/reference/Item.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/reference/Item.java
new file mode 100644
index 0000000000..9123f7f0a9
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/reference/Item.java
@@ -0,0 +1,63 @@
+package com.baeldung.jacksonannotation.general.reference;
+
+import com.fasterxml.jackson.annotation.JsonBackReference;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Item {
+
+ private UUID id;
+ private String title;
+
+ @JsonBackReference
+ private List authors = new ArrayList<>();
+ private float price;
+
+ public Item(){}
+
+ public Item(String title, Author author) {
+ this.id = UUID.randomUUID();
+ this.title = title;
+ this.authors.add(author);
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public void setId(UUID id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public List getAuthors() {
+ return authors;
+ }
+
+ public void setAuthors(List authors) {
+ this.authors = authors;
+ }
+
+ public float getPrice() {
+ return price;
+ }
+
+ public void setPrice(float price) {
+ this.price = price;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/reference/Person.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/reference/Person.java
new file mode 100644
index 0000000000..372b18d873
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/general/reference/Person.java
@@ -0,0 +1,44 @@
+package com.baeldung.jacksonannotation.general.reference;
+
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Person {
+
+ private UUID id;
+ private String firstName;
+ private String lastName;
+
+ public Person(){}
+
+ public Person(String firstName, String lastName) {
+ this.id = UUID.randomUUID();
+ this.firstName = firstName;
+ this.lastName = lastName;
+ }
+
+ 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 UUID getId() {
+ return id;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonautodetect/Order.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonautodetect/Order.java
new file mode 100644
index 0000000000..a5bd1b1c7e
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonautodetect/Order.java
@@ -0,0 +1,54 @@
+package com.baeldung.jacksonannotation.inclusion.jsonautodetect;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+@JsonAutoDetect(fieldVisibility = Visibility.ANY)
+public class Order {
+
+ private UUID id;
+ private Type type;
+ private int internalAudit;
+
+ public static class Type {
+ public long id;
+ public String name;
+ }
+
+ public Order() {
+ this.id = UUID.randomUUID();
+ }
+
+ public Order(Type type) {
+ this();
+ this.type = type;
+ }
+
+ public Order(int internalAudit) {
+ this();
+ this.type = new Type();
+ this.type.id = 20;
+ this.type.name = "Order";
+ this.internalAudit = internalAudit;
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public Type getType() {
+ return type;
+ }
+
+ public void setType(Type type) {
+ this.type = type;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonignore/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonignore/Author.java
new file mode 100644
index 0000000000..f1f1b07f43
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonignore/Author.java
@@ -0,0 +1,29 @@
+package com.baeldung.jacksonannotation.inclusion.jsonignore;
+
+import com.baeldung.jacksonannotation.domain.Item;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Author extends Person {
+
+ private List
- items = new ArrayList<>();
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonignore/Person.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonignore/Person.java
new file mode 100644
index 0000000000..8f084e1e99
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonignore/Person.java
@@ -0,0 +1,47 @@
+package com.baeldung.jacksonannotation.inclusion.jsonignore;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Person {
+
+ @JsonIgnore
+ private UUID id;
+ private String firstName;
+ private String lastName;
+
+ public Person(){}
+
+ public Person(String firstName, String lastName) {
+ this.id = UUID.randomUUID();
+ this.firstName = firstName;
+ this.lastName = lastName;
+ }
+
+ 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 UUID getId() {
+ return id;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonignoreproperties/Course.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonignoreproperties/Course.java
new file mode 100644
index 0000000000..6eddad2bda
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonignoreproperties/Course.java
@@ -0,0 +1,76 @@
+package com.baeldung.jacksonannotation.inclusion.jsonignoreproperties;
+
+import com.baeldung.jacksonannotation.domain.Author;
+import com.baeldung.jacksonannotation.domain.Item;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+@JsonIgnoreProperties({"medium"})
+public class Course extends Item {
+
+ public enum Medium {CLASSROOM, ONLINE}
+
+ public enum Level {
+ BEGINNER("Beginner", 1), INTERMEDIATE("Intermediate", 2), ADVANCED("Advanced", 3);
+
+ private String name;
+ private int number;
+
+ Level(String name, int number) {
+ this.name = name;
+ this.number = number;
+ }
+
+ public String getName() {
+ return name;
+ }
+ }
+
+ private float duration;
+ private Medium medium;
+ private Level level;
+ private List prerequisite;
+
+ public Course(String title, Author author) {
+ super(title, author);
+ }
+
+ public float getDuration() {
+ return duration;
+ }
+
+ public void setDuration(float duration) {
+ this.duration = duration;
+ }
+
+ public Medium getMedium() {
+ return medium;
+ }
+
+ public void setMedium(Medium medium) {
+ this.medium = medium;
+ }
+
+ public Level getLevel() {
+ return level;
+ }
+
+ public void setLevel(Level level) {
+ this.level = level;
+ }
+
+ public List getPrerequisite() {
+ return prerequisite;
+ }
+
+ public void setPrerequisite(List prerequisite) {
+ this.prerequisite = prerequisite;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonignoretype/Order.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonignoretype/Order.java
new file mode 100644
index 0000000000..8402f00cfb
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsonignoretype/Order.java
@@ -0,0 +1,44 @@
+package com.baeldung.jacksonannotation.inclusion.jsonignoretype;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreType;
+
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Order {
+
+ private UUID id;
+ private Type type;
+
+ @JsonIgnoreType
+ public static class Type {
+ public long id;
+ public String name;
+ }
+
+ public Order() {
+ this.id = UUID.randomUUID();
+ }
+
+ public Order(Type type) {
+ this();
+ this.type = type;
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public Type getType() {
+ return type;
+ }
+
+ public void setType(Type type) {
+ this.type = type;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsoninclude/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsoninclude/Author.java
new file mode 100644
index 0000000000..7ccbf69a79
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/inclusion/jsoninclude/Author.java
@@ -0,0 +1,34 @@
+package com.baeldung.jacksonannotation.inclusion.jsoninclude;
+
+import com.baeldung.jacksonannotation.domain.Item;
+import com.baeldung.jacksonannotation.domain.Person;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+@JsonInclude(NON_NULL)
+public class Author extends Person {
+
+ private List
- items = new ArrayList<>();
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/custom/Course.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/custom/Course.java
new file mode 100644
index 0000000000..0cfb6a88e3
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/custom/Course.java
@@ -0,0 +1,74 @@
+package com.baeldung.jacksonannotation.miscellaneous.custom;
+
+import com.baeldung.jacksonannotation.domain.Author;
+
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+@CustomCourseAnnotation
+public class Course extends Item {
+
+ public enum Medium {CLASSROOM, ONLINE}
+
+ public enum Level {
+ BEGINNER("Beginner", 1), INTERMEDIATE("Intermediate", 2), ADVANCED("Advanced", 3);
+
+ private String name;
+ private int number;
+
+ Level(String name, int number) {
+ this.name = name;
+ this.number = number;
+ }
+
+ public String getName() {
+ return name;
+ }
+ }
+
+ private float duration;
+ private Medium medium;
+ private Level level;
+ private List prerequisite;
+
+ public Course(String title, Author author) {
+ super(title, author);
+ }
+
+ public float getDuration() {
+ return duration;
+ }
+
+ public void setDuration(float duration) {
+ this.duration = duration;
+ }
+
+ public Medium getMedium() {
+ return medium;
+ }
+
+ public void setMedium(Medium medium) {
+ this.medium = medium;
+ }
+
+ public Level getLevel() {
+ return level;
+ }
+
+ public void setLevel(Level level) {
+ this.level = level;
+ }
+
+ public List getPrerequisite() {
+ return prerequisite;
+ }
+
+ public void setPrerequisite(List prerequisite) {
+ this.prerequisite = prerequisite;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/custom/CustomCourseAnnotation.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/custom/CustomCourseAnnotation.java
new file mode 100644
index 0000000000..a77cbb722c
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/custom/CustomCourseAnnotation.java
@@ -0,0 +1,20 @@
+package com.baeldung.jacksonannotation.miscellaneous.custom;
+
+import com.fasterxml.jackson.annotation.*;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@JacksonAnnotationsInside
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({"title", "price", "id", "duration", "authors", "level"})
+@JsonIgnoreProperties({"prerequisite"})
+public @interface CustomCourseAnnotation {
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/custom/Item.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/custom/Item.java
new file mode 100644
index 0000000000..3d4411b201
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/custom/Item.java
@@ -0,0 +1,62 @@
+package com.baeldung.jacksonannotation.miscellaneous.custom;
+
+import com.baeldung.jacksonannotation.domain.Author;
+import com.baeldung.jacksonannotation.domain.Person;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Item {
+
+ private UUID id;
+ private String title;
+ private List authors = new ArrayList<>();
+ private float price;
+
+ public Item(){}
+
+ public Item(String title, Author author) {
+ this.id = UUID.randomUUID();
+ this.title = title;
+ this.authors.add(author);
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public void setId(UUID id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public List getAuthors() {
+ return authors;
+ }
+
+ public void setAuthors(List authors) {
+ this.authors = authors;
+ }
+
+ public float getPrice() {
+ return price;
+ }
+
+ public void setPrice(float price) {
+ this.price = price;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/disable/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/disable/Author.java
new file mode 100644
index 0000000000..f3e0fdc63f
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/disable/Author.java
@@ -0,0 +1,36 @@
+package com.baeldung.jacksonannotation.miscellaneous.disable;
+
+import com.baeldung.jacksonannotation.domain.Item;
+import com.baeldung.jacksonannotation.domain.Person;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({"lastName", "items", "firstName", "id"})
+public class Author extends Person {
+
+ @JsonIgnore
+ private List
- items = new ArrayList<>();
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/mixin/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/mixin/Author.java
new file mode 100644
index 0000000000..155a7f5e5d
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/mixin/Author.java
@@ -0,0 +1,30 @@
+package com.baeldung.jacksonannotation.miscellaneous.mixin;
+
+import com.baeldung.jacksonannotation.domain.Item;
+import com.baeldung.jacksonannotation.domain.Person;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Author extends Person {
+
+ private List
- items = new ArrayList<>();
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/mixin/IgnoreListMixIn.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/mixin/IgnoreListMixIn.java
new file mode 100644
index 0000000000..c1aec05041
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/miscellaneous/mixin/IgnoreListMixIn.java
@@ -0,0 +1,13 @@
+package com.baeldung.jacksonannotation.miscellaneous.mixin;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreType;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+@JsonIgnoreType
+public class IgnoreListMixIn {
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/polymorphism/Order.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/polymorphism/Order.java
new file mode 100644
index 0000000000..77ac6d0e67
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/polymorphism/Order.java
@@ -0,0 +1,66 @@
+package com.baeldung.jacksonannotation.polymorphism;
+
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Order {
+
+ private UUID id;
+ private Type type;
+ private int internalAudit;
+
+ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
+ include = JsonTypeInfo.As.PROPERTY,
+ property = "ordertype")
+ @JsonSubTypes({
+ @JsonSubTypes.Type(value = InternalType.class, name = "internal")
+ })
+ public static class Type {
+ public long id;
+ public String name;
+ }
+
+ @JsonTypeName("internal")
+ public static class InternalType extends Type {
+ public long id;
+ public String name;
+ }
+
+ public Order() {
+ this.id = UUID.randomUUID();
+ }
+
+ public Order(Type type) {
+ this();
+ this.type = type;
+ }
+
+ public Order(int internalAudit) {
+ this();
+ this.type = new Type();
+ this.type.id = 20;
+ this.type.name = "Order";
+ this.internalAudit = internalAudit;
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public Type getType() {
+ return type;
+ }
+
+ public void setType(Type type) {
+ this.type = type;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonanygetter/Inventory.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonanygetter/Inventory.java
new file mode 100644
index 0000000000..898617b7b2
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonanygetter/Inventory.java
@@ -0,0 +1,43 @@
+package com.baeldung.jacksonannotation.serialization.jsonanygetter;
+
+import com.baeldung.jacksonannotation.domain.Author;
+import com.baeldung.jacksonannotation.domain.Item;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Inventory {
+
+ private String location;
+
+ private Map stock = new HashMap<>();
+
+ private Map countryDeliveryCost = new HashMap<>();
+
+ public String getLocation() {
+ return location;
+ }
+
+ public void setLocation(String location) {
+ this.location = location;
+ }
+
+ @JsonIgnore
+ public Map getStock() {
+ return stock;
+ }
+
+ @JsonAnyGetter
+ public Map getCountryDeliveryCost() {
+ return countryDeliveryCost;
+ }
+
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsongetter/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsongetter/Author.java
new file mode 100644
index 0000000000..92283a32a0
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsongetter/Author.java
@@ -0,0 +1,33 @@
+package com.baeldung.jacksonannotation.serialization.jsongetter;
+
+
+import com.baeldung.jacksonannotation.domain.Item;
+import com.baeldung.jacksonannotation.domain.Person;
+import com.fasterxml.jackson.annotation.JsonGetter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Author extends Person {
+
+ List
- items = new ArrayList<>();
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ @JsonGetter("publications")
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonpropertyorder/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonpropertyorder/Author.java
new file mode 100644
index 0000000000..ee708e0d80
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonpropertyorder/Author.java
@@ -0,0 +1,32 @@
+package com.baeldung.jacksonannotation.serialization.jsonpropertyorder;
+
+
+import com.baeldung.jacksonannotation.domain.Item;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+@JsonPropertyOrder({"items", "firstName", "lastName", "id"})
+public class Author extends Person {
+
+ List
- items = new ArrayList<>();
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonpropertyorder/Person.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonpropertyorder/Person.java
new file mode 100644
index 0000000000..96904c2678
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonpropertyorder/Person.java
@@ -0,0 +1,42 @@
+package com.baeldung.jacksonannotation.serialization.jsonpropertyorder;
+
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Person {
+
+ private UUID id;
+ private String firstName;
+ private String lastName;
+
+ public Person(String firstName, String lastName) {
+ this.id = UUID.randomUUID();
+ this.firstName = firstName;
+ this.lastName = lastName;
+ }
+
+ 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 UUID getId() {
+ return id;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonrawvalue/Customer.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonrawvalue/Customer.java
new file mode 100644
index 0000000000..ddd0f63a8d
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonrawvalue/Customer.java
@@ -0,0 +1,28 @@
+package com.baeldung.jacksonannotation.serialization.jsonrawvalue;
+
+import com.baeldung.jacksonannotation.domain.Person;
+import com.fasterxml.jackson.annotation.JsonRawValue;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Customer extends Person {
+
+ @JsonRawValue
+ private String configuration;
+
+ public Customer(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public String getConfiguration() {
+ return configuration;
+ }
+
+ public void setConfiguration(String configuration) {
+ this.configuration = configuration;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonrootname/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonrootname/Author.java
new file mode 100644
index 0000000000..b33f6fecee
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonrootname/Author.java
@@ -0,0 +1,32 @@
+package com.baeldung.jacksonannotation.serialization.jsonrootname;
+
+import com.baeldung.jacksonannotation.domain.Item;
+import com.baeldung.jacksonannotation.domain.Person;
+import com.fasterxml.jackson.annotation.JsonRootName;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+@JsonRootName("writer")
+public class Author extends Person {
+
+ List
- items = new ArrayList<>();
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonserialize/Author.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonserialize/Author.java
new file mode 100644
index 0000000000..5599b0b796
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonserialize/Author.java
@@ -0,0 +1,30 @@
+package com.baeldung.jacksonannotation.serialization.jsonserialize;
+
+import com.baeldung.jacksonannotation.domain.Item;
+import com.baeldung.jacksonannotation.domain.Person;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Author extends Person {
+
+ List
- items = new ArrayList<>();
+
+ public Author(String firstName, String lastName) {
+ super(firstName, lastName);
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonserialize/Book.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonserialize/Book.java
new file mode 100644
index 0000000000..a8a05b093c
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonserialize/Book.java
@@ -0,0 +1,53 @@
+package com.baeldung.jacksonannotation.serialization.jsonserialize;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Book extends Item {
+
+ private String ISBN;
+
+ @JsonSerialize(using = CustomDateSerializer.class)
+ private Date published;
+ private BigDecimal pages;
+
+ public Book(){
+ super();
+ }
+
+ public Book(String title, Author author) {
+ super(title, author);
+ }
+
+ public String getISBN() {
+ return ISBN;
+ }
+
+ public void setISBN(String ISBN) {
+ this.ISBN = ISBN;
+ }
+
+ public Date getPublished() {
+ return published;
+ }
+
+ public void setPublished(Date published) {
+ this.published = published;
+ }
+
+ public BigDecimal getPages() {
+ return pages;
+ }
+
+ public void setPages(BigDecimal pages) {
+ this.pages = pages;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonserialize/CustomDateSerializer.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonserialize/CustomDateSerializer.java
new file mode 100644
index 0000000000..82ad49e9c4
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonserialize/CustomDateSerializer.java
@@ -0,0 +1,36 @@
+package com.baeldung.jacksonannotation.serialization.jsonserialize;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class CustomDateSerializer extends StdSerializer {
+
+ private static SimpleDateFormat formatter =
+ new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
+
+ public CustomDateSerializer() {
+ this(null);
+ }
+
+ public CustomDateSerializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public void serialize(Date value, JsonGenerator gen, SerializerProvider arg2)
+ throws IOException, JsonProcessingException {
+ gen.writeString(formatter.format(value));
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonserialize/Item.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonserialize/Item.java
new file mode 100644
index 0000000000..c56dc9b6ff
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonserialize/Item.java
@@ -0,0 +1,61 @@
+package com.baeldung.jacksonannotation.serialization.jsonserialize;
+
+import com.baeldung.jacksonannotation.domain.Person;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Item {
+
+ private UUID id;
+ private String title;
+ private List authors = new ArrayList<>();
+ private float price;
+
+ public Item(){}
+
+ public Item(String title, Author author) {
+ this.id = UUID.randomUUID();
+ this.title = title;
+ this.authors.add(author);
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public void setId(UUID id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public List getAuthors() {
+ return authors;
+ }
+
+ public void setAuthors(List authors) {
+ this.authors = authors;
+ }
+
+ public float getPrice() {
+ return price;
+ }
+
+ public void setPrice(float price) {
+ this.price = price;
+ }
+}
diff --git a/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonvalue/Course.java b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonvalue/Course.java
new file mode 100644
index 0000000000..cb48044ce5
--- /dev/null
+++ b/jackson-annotations/src/main/java/com/baeldung/jacksonannotation/serialization/jsonvalue/Course.java
@@ -0,0 +1,76 @@
+package com.baeldung.jacksonannotation.serialization.jsonvalue;
+
+import com.baeldung.jacksonannotation.domain.Author;
+import com.baeldung.jacksonannotation.domain.Item;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+import java.util.List;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class Course extends Item {
+
+ public enum Medium {CLASSROOM, ONLINE}
+
+ public enum Level {
+ BEGINNER("Beginner", 1), INTERMEDIATE("Intermediate", 2), ADVANCED("Advanced", 3);
+
+ private String name;
+ private int number;
+
+ Level(String name, int number) {
+ this.name = name;
+ this.number = number;
+ }
+
+ @JsonValue
+ public String getName() {
+ return name;
+ }
+ }
+
+ private float duration;
+ private Medium medium;
+ private Level level;
+ private List prerequisite;
+
+ public Course(String title, Author author) {
+ super(title, author);
+ }
+
+ public float getDuration() {
+ return duration;
+ }
+
+ public void setDuration(float duration) {
+ this.duration = duration;
+ }
+
+ public Medium getMedium() {
+ return medium;
+ }
+
+ public void setMedium(Medium medium) {
+ this.medium = medium;
+ }
+
+ public Level getLevel() {
+ return level;
+ }
+
+ public void setLevel(Level level) {
+ this.level = level;
+ }
+
+ public List getPrerequisite() {
+ return prerequisite;
+ }
+
+ public void setPrerequisite(List prerequisite) {
+ this.prerequisite = prerequisite;
+ }
+}
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jacksoninject/JacksonInjectTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jacksoninject/JacksonInjectTest.java
new file mode 100644
index 0000000000..7c9436d711
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jacksoninject/JacksonInjectTest.java
@@ -0,0 +1,45 @@
+package com.baeldung.jacksonannotation.deserialization.jacksoninject;
+
+import com.fasterxml.jackson.databind.InjectableValues;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.UUID;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JacksonInjectTest {
+
+ @Test
+ public void whenDeserializingUsingJacksonInject_thenCorrect() throws IOException {
+
+ UUID id = UUID.fromString("9616dc8c-bad3-11e6-a4a6-cec0c932ce01");
+
+ // arrange
+ String authorJson = "{\"firstName\": \"Alex\", \"lastName\": \"Theedom\"}";
+
+ // act
+ InjectableValues inject = new InjectableValues.Std().addValue(UUID.class, id);
+ Author author = new ObjectMapper().reader(inject).forType(Author.class).readValue(authorJson);
+
+ // assert
+ assertThat(author.getId()).isEqualTo(id);
+
+
+ /*
+ {
+ "firstName": "Alex",
+ "lastName": "Theedom",
+ "publications": []
+ }
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jsonanysetter/JsonAnySetterTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jsonanysetter/JsonAnySetterTest.java
new file mode 100644
index 0000000000..d735f31a0b
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jsonanysetter/JsonAnySetterTest.java
@@ -0,0 +1,37 @@
+package com.baeldung.jacksonannotation.deserialization.jsonanysetter;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonAnySetterTest {
+
+ @Test
+ public void whenDeserializingUsingJsonAnySetter_thenCorrect() throws IOException {
+
+ // arrange
+ String json = "{\"USA\":10.00,\"UK\":15.00,\"China\":23.00,\"Brazil\":12.00,\"France\":8.00,\"Russia\":18.00}";
+
+ // act
+ Inventory inventory = new ObjectMapper().readerFor(Inventory.class).readValue(json);
+
+ // assert
+ assertThat(from(json).getMap(".").get("USA")).isEqualTo(inventory.getCountryDeliveryCost().get("USA"));
+ assertThat(from(json).getMap(".").get("UK")).isEqualTo(inventory.getCountryDeliveryCost().get("UK"));
+ assertThat(from(json).getMap(".").get("China")).isEqualTo(inventory.getCountryDeliveryCost().get("China"));
+ assertThat(from(json).getMap(".").get("Brazil")).isEqualTo(inventory.getCountryDeliveryCost().get("Brazil"));
+ assertThat(from(json).getMap(".").get("France")).isEqualTo(inventory.getCountryDeliveryCost().get("France"));
+ assertThat(from(json).getMap(".").get("Russia")).isEqualTo(inventory.getCountryDeliveryCost().get("Russia"));
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jsoncreator/JsonCreatorTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jsoncreator/JsonCreatorTest.java
new file mode 100644
index 0000000000..a2c05811df
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jsoncreator/JsonCreatorTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.jacksonannotation.deserialization.jsoncreator;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonCreatorTest {
+
+ @Test
+ public void whenDeserializingUsingJsonCreator_thenCorrect() throws IOException {
+
+ // arrange
+ String authorJson =
+ "{" +
+ " \"christianName\": \"Alex\"," +
+ " \"surname\": \"Theedom\"" +
+ "}";
+
+ // act
+ final Author author = new ObjectMapper().readerFor(Author.class).readValue(authorJson);
+
+ // assert
+ assertThat(from(authorJson).getString("christianName")).isEqualTo(author.getFirstName());
+ assertThat(from(authorJson).getString("surname")).isEqualTo(author.getLastName());
+
+ /*
+ {
+ "christianName": "Alex",
+ "surname": "Theedom"
+ }
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/JsonDeserializeTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/JsonDeserializeTest.java
new file mode 100644
index 0000000000..6ad06fd2b9
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jsondeserialize/JsonDeserializeTest.java
@@ -0,0 +1,34 @@
+package com.baeldung.jacksonannotation.deserialization.jsondeserialize;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonDeserializeTest {
+
+ @Test
+ public void whenDeserializingUsingJsonDeserialize_thenCorrect() throws IOException {
+
+ // arrange
+ String bookJson = "{\"id\":\"957c43f2-fa2e-42f9-bf75-6e3d5bb6960a\",\"title\":\"Effective Java\",\"authors\":[{\"id\":\"9bcd817d-0141-42e6-8f04-e5aaab0980b6\",\"firstName\":\"Joshua\",\"lastName\":\"Bloch\"}],\"price\":0,\"published\":\"25-12-2017 13:30:25\",\"pages\":null,\"isbn\":null}";
+
+ // act
+ Book book = new ObjectMapper().readerFor(Book.class).readValue(bookJson);
+
+ // assert
+ SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
+ assertThat(from(bookJson).getString("published")).isEqualTo(df.format(book.getPublished()));
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jsonsetter/JsonSetterTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jsonsetter/JsonSetterTest.java
new file mode 100644
index 0000000000..10b48afc15
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/deserialization/jsonsetter/JsonSetterTest.java
@@ -0,0 +1,32 @@
+package com.baeldung.jacksonannotation.deserialization.jsonsetter;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonSetterTest {
+
+ @Test
+ public void whenDeserializingUsingJsonSetter_thenCorrect() throws IOException {
+
+ // arrange
+ String json = "{\"firstName\":\"Alex\",\"lastName\":\"Theedom\",\"publications\":[{\"title\":\"Professional Java EE Design Patterns\"}]}";
+
+ // act
+ Author author = new ObjectMapper().readerFor(Author.class).readValue(json);
+
+ // assert
+ assertThat(from(json).getList("publications").size()).isEqualTo(author.getItems().size());
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonfilter/JsonFilterTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonfilter/JsonFilterTest.java
new file mode 100644
index 0000000000..fa7f9326a2
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonfilter/JsonFilterTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.jacksonannotation.general.jsonfilter;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ser.FilterProvider;
+import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
+import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
+import org.junit.Test;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonFilterTest {
+
+ @Test
+ public void whenSerializingUsingJsonFilter_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Author author = new Author("Alex", "Theedom");
+ FilterProvider filters = new SimpleFilterProvider()
+ .addFilter("authorFilter", SimpleBeanPropertyFilter.filterOutAllExcept("lastName"));
+
+ // act
+ String result = new ObjectMapper().writer(filters).writeValueAsString(author);
+
+ // assert
+ assertThat(from(result).getList("items")).isNull();
+
+ /*
+ {
+ "lastName": "Theedom"
+ }
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonformat/JsonFormatTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonformat/JsonFormatTest.java
new file mode 100644
index 0000000000..9d61fc409f
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonformat/JsonFormatTest.java
@@ -0,0 +1,66 @@
+package com.baeldung.jacksonannotation.general.jsonformat;
+
+import com.baeldung.jacksonannotation.domain.Author;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonFormatTest {
+
+ @Test
+ public void whenSerializingUsingJsonFormat_thenCorrect() throws JsonProcessingException, ParseException {
+
+ // arrange
+ SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
+ df.setTimeZone(TimeZone.getTimeZone("UTC"));
+
+ String toParse = "20-12-2014 14:30:00";
+ Date date = df.parse(toParse);
+
+ Book book = new Book(
+ "Design Patterns: Elements of Reusable Object-oriented Software",
+ new Author("The", "GoF")
+ );
+ book.setPublished(date);
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(book);
+
+ // assert
+ assertThat(from(result).getString("published")).isEqualTo(toParse);
+
+ /*
+ {
+ "id": "762b39be-fd5b-489e-8688-aeb3b9bbf019",
+ "title": "Design Patterns: Elements of Reusable Object-oriented Software",
+ "authors": [
+ {
+ "id": "6941b780-0f54-4259-adcb-85523c8f25f4",
+ "firstName": "The",
+ "lastName": "GoF",
+ "items": []
+ }
+ ],
+ "price": 0,
+ "published": "20-12-2014 02:30:00",
+ "pages": null,
+ "isbn": null
+ }
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/JsonIdentityInfoTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/JsonIdentityInfoTest.java
new file mode 100644
index 0000000000..1b08e08c10
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonidentityinfo/JsonIdentityInfoTest.java
@@ -0,0 +1,60 @@
+package com.baeldung.jacksonannotation.general.jsonidentityinfo;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.util.Collections;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonIdentityInfoTest {
+
+ @Test
+ public void whenSerializingUsingJsonIdentityInfo_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Author author = new Author("Alex", "Theedom");
+
+ Course course = new Course("Java EE Introduction", author);
+ author.setItems(Collections.singletonList(course));
+ course.setAuthors(Collections.singletonList(author));
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(author);
+
+ // assert
+ assertThat(from(result).getString("items[0].authors")).isNotNull();
+
+ /*
+ Authors are included.
+ {
+ "id": "1b408bf9-5946-4a14-a112-fde2953a7fe7",
+ "firstName": "Alex",
+ "lastName": "Theedom",
+ "items": [
+ {
+ "id": "5ed30530-f0a5-42eb-b786-be2c655da968",
+ "title": "Java EE Introduction",
+ "authors": [
+ "1b408bf9-5946-4a14-a112-fde2953a7fe7"
+ ],
+ "price": 0,
+ "duration": 0,
+ "medium": null,
+ "level": null,
+ "prerequisite": null
+ }
+ ]
+ }
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonproperty/JsonPropertyTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonproperty/JsonPropertyTest.java
new file mode 100644
index 0000000000..acfe735dd3
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonproperty/JsonPropertyTest.java
@@ -0,0 +1,73 @@
+package com.baeldung.jacksonannotation.general.jsonproperty;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonPropertyTest {
+
+ @Test
+ public void whenSerializingUsingJsonProperty_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Book book = new Book(
+ "Design Patterns: Elements of Reusable Object-oriented Software",
+ new Author("The", "GoF")
+ );
+ book.configureBinding("Hardback");
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(book);
+
+ // assert
+ assertThat(from(result).getString("binding")).isEqualTo("Hardback");
+
+ /*
+ {
+ "id": "cd941587-d1ae-4c2a-9a36-29533bf50411",
+ "title": "Design Patterns: Elements of Reusable Object-oriented Software",
+ "authors": [
+ {
+ "id": "c8e26318-2f5b-4fa2-9fdc-6e99be021fca",
+ "firstName": "The",
+ "lastName": "GoF",
+ "items": []
+ }
+ ],
+ "price": 0,
+ "published": null,
+ "pages": null,
+ "isbn": null,
+ "binding": "Hardback"
+ }
+ */
+
+ }
+
+ @Test
+ public void whenDeserializingUsingJsonProperty_thenCorrect() throws IOException {
+
+ // arrange
+ String result = "{\"id\":\"cd941587-d1ae-4c2a-9a36-29533bf50411\",\"title\":\"Design Patterns: Elements of Reusable Object-oriented Software\",\"authors\":[{\"id\":\"c8e26318-2f5b-4fa2-9fdc-6e99be021fca\",\"firstName\":\"The\",\"lastName\":\"GoF\"}],\"binding\":\"Hardback\"}";
+
+ // act
+ Book book = new ObjectMapper().readerFor(Book.class).readValue(result);
+
+ // assert
+ assertThat(book.coverBinding()).isEqualTo("Hardback");
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonunwrapped/JsonUnwrappedTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonunwrapped/JsonUnwrappedTest.java
new file mode 100644
index 0000000000..63ad4e3c9f
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonunwrapped/JsonUnwrappedTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.jacksonannotation.general.jsonunwrapped;
+
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonUnwrappedTest {
+
+ @Test
+ public void whenSerializingUsingJsonUnwrapped_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Order.Type preorderType = new Order.Type();
+ preorderType.id = 10;
+ preorderType.name = "pre-order";
+
+ Order order = new Order(preorderType);
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(order);
+
+ // assert
+ assertThat(from(result).getInt("id")).isEqualTo(10);
+ assertThat(from(result).getString("name")).isEqualTo("pre-order");
+
+ /*
+ {
+ "id": 10,
+ "name": "pre-order"
+ }
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonview/JsonViewTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonview/JsonViewTest.java
new file mode 100644
index 0000000000..e64b815b11
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/jsonview/JsonViewTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.jacksonannotation.general.jsonview;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonViewTest {
+
+ @Test
+ public void whenSerializingUsingJsonView_andInternalView_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Order order = new Order(120);
+
+ // act
+ String result = new ObjectMapper().writerWithView(Views.Internal.class).writeValueAsString(order);
+
+ // assert
+ assertThat(from(result).getUUID("id")).isNotNull();
+ assertThat(from(result).getObject("type", Order.Type.class)).isNotNull();
+ assertThat(from(result).getInt("internalAudit")).isEqualTo(120);
+
+ /*
+ {
+ "id": "33806388-795b-4812-b90a-60292111bc5c",
+ "type": {
+ "id": 20,
+ "name": "Order"
+ },
+ "internalAudit": 120
+ }
+ */
+
+ }
+
+ @Test
+ public void whenSerializingUsingJsonView_andPublicView_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Order order = new Order(120);
+
+ // act
+ String result = new ObjectMapper().writerWithView(Views.Public.class).writeValueAsString(order);
+
+ // assert
+ assertThat(from(result).getUUID("id")).isNotNull();
+ assertThat(from(result).getObject("type", Order.Type.class)).isNotNull();
+ assertThat(result).doesNotContain("internalAudit");
+
+ /*
+ {
+ "id": "5184d5fc-e359-4cdf-93fa-4054025bef4e",
+ "type": {
+ "id": 20,
+ "name": "Order"
+ }
+ }
+ */
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/reference/ReferenceTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/reference/ReferenceTest.java
new file mode 100644
index 0000000000..acea159b4f
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/general/reference/ReferenceTest.java
@@ -0,0 +1,59 @@
+package com.baeldung.jacksonannotation.general.reference;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.util.Collections;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class ReferenceTest {
+
+ @Test
+ public void whenSerializingUsingReference_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Author author = new Author("Alex", "Theedom");
+
+ Course course = new Course("Java EE Introduction", author);
+ author.setItems(Collections.singletonList(course));
+ course.setAuthors(Collections.singletonList(author));
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(author);
+
+ // assert
+ assertThat(from(result).getString("items[0].authors")).isNull();
+
+ /*
+ Without references defined it throws StackOverflowError.
+ Authors excluded.
+
+ {
+ "id": "9c45d9b3-4888-4c24-8b74-65ef35627cd7",
+ "firstName": "Alex",
+ "lastName": "Theedom",
+ "items": [
+ {
+ "id": "f8309629-d178-4d67-93a4-b513ec4a7f47",
+ "title": "Java EE Introduction",
+ "price": 0,
+ "duration": 0,
+ "medium": null,
+ "level": null,
+ "prerequisite": null
+ }
+ ]
+ }
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsonautodetect/JsonAutoDetectTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsonautodetect/JsonAutoDetectTest.java
new file mode 100644
index 0000000000..325a7ad338
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsonautodetect/JsonAutoDetectTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.jacksonannotation.inclusion.jsonautodetect;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonAutoDetectTest {
+
+ @Test
+ public void whenSerializingUsingJsonAutoDetect_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Order order = new Order(1234567890);
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(order);
+
+ // assert
+ assertThat(from(result).getInt("internalAudit")).isEqualTo(1234567890);
+
+ /*
+ With @JsonAutoDetect
+ {
+ "id": "c94774d9-de8f-4244-85d5-624bd3a4567a",
+ "type": {
+ "id": 20,
+ "name": "Order"
+ },
+ "internalAudit": 1234567890
+ }
+
+ Without @JsonAutoDetect
+ {
+ "id": "c94774d9-de8f-4244-85d5-624bd3a4567a",
+ "type": {
+ "id": 20,
+ "name": "Order"
+ }
+ }
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsonignore/JsonIgnoreTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsonignore/JsonIgnoreTest.java
new file mode 100644
index 0000000000..d5476b7442
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsonignore/JsonIgnoreTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.jacksonannotation.inclusion.jsonignore;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonIgnoreTest {
+
+ @Test
+ public void whenSerializingUsingJsonIgnore_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Author author = new Author("Alex", "Theedom");
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(author);
+
+ // assert
+ assertThat(from(result).getString("firstName")).isEqualTo("Alex");
+ assertThat(from(result).getString("lastName")).isEqualTo("Theedom");
+ assertThat(from(result).getString("id")).isNull();
+
+ /*
+ {
+ "firstName": "Alex",
+ "lastName": "Theedom",
+ "items": []
+ }
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsonignoreproperties/JsonIgnorePropertiesTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsonignoreproperties/JsonIgnorePropertiesTest.java
new file mode 100644
index 0000000000..ff9047a98c
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsonignoreproperties/JsonIgnorePropertiesTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.jacksonannotation.inclusion.jsonignoreproperties;
+
+import com.baeldung.jacksonannotation.domain.Author;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonIgnorePropertiesTest {
+
+ @Test
+ public void whenSerializingUsingJsonIgnoreProperties_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Course course = new Course("Spring Security", new Author("Eugen", "Paraschiv"));
+ course.setMedium(Course.Medium.ONLINE);
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(course);
+
+ // assert
+ assertThat(from(result).getString("medium")).isNull();
+
+ /*
+ {
+ "id": "ef0c8d2b-b088-409e-905c-95ac88dc0ed0",
+ "title": "Spring Security",
+ "authors": [
+ {
+ "id": "47a4f498-b0f3-4daf-909f-d2c35a0fe3c2",
+ "firstName": "Eugen",
+ "lastName": "Paraschiv",
+ "items": []
+ }
+ ],
+ "price": 0,
+ "duration": 0,
+ "level": null,
+ "prerequisite": null
+ }
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsonignoretype/JsonIgnoreTypeTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsonignoretype/JsonIgnoreTypeTest.java
new file mode 100644
index 0000000000..b80cda826f
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsonignoretype/JsonIgnoreTypeTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.jacksonannotation.inclusion.jsonignoretype;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonIgnoreTypeTest {
+
+ @Test
+ public void whenSerializingUsingJsonIgnoreType_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Order.Type type = new Order.Type();
+ type.id = 10;
+ type.name = "Pre-order";
+
+ Order order = new Order(type);
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(order);
+
+ // assert
+ assertThat(from(result).getString("id")).isNotNull();
+ assertThat(from(result).getString("type")).isNull();
+
+ /*
+ {"id":"ac2428da-523e-443c-a18a-4ea4d2791fea"}
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsoninclude/JsonIncludeTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsoninclude/JsonIncludeTest.java
new file mode 100644
index 0000000000..6a1201701a
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/inclusion/jsoninclude/JsonIncludeTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.jacksonannotation.inclusion.jsoninclude;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonIncludeTest {
+
+ @Test
+ public void whenSerializingUsingJsonInclude_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Author author = new Author("Alex", null);
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(author);
+
+ // assert
+ assertThat(from(result).getString("firstName")).isEqualTo("Alex");
+ assertThat(result).doesNotContain("lastName");
+
+
+ /*
+ {
+ "id": "e8bb4802-6e0c-4fa5-9f68-c233272399cd",
+ "firstName": "Alex",
+ "items": []
+ }
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/miscellaneous/custom/CustomTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/miscellaneous/custom/CustomTest.java
new file mode 100644
index 0000000000..8178d12a18
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/miscellaneous/custom/CustomTest.java
@@ -0,0 +1,51 @@
+package com.baeldung.jacksonannotation.miscellaneous.custom;
+
+import com.baeldung.jacksonannotation.domain.Author;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class CustomTest {
+
+ @Test
+ public void whenSerializingUsingCustom_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Course course = new Course("Spring Security", new Author("Eugen", "Paraschiv"));
+ course.setMedium(Course.Medium.ONLINE);
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(course);
+
+ // assert
+ assertThat(from(result).getString("title")).isEqualTo("Spring Security");
+
+ /*
+ {
+ "title": "Spring Security",
+ "price": 0,
+ "id": "7dfd4db9-1175-432f-a53b-687423f7bb9b",
+ "duration": 0,
+ "authors": [
+ {
+ "id": "da0738f6-033c-4974-8d87-92820e5ccf27",
+ "firstName": "Eugen",
+ "lastName": "Paraschiv",
+ "items": []
+ }
+ ],
+ "medium": "ONLINE"
+ }
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/miscellaneous/disable/DisableTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/miscellaneous/disable/DisableTest.java
new file mode 100644
index 0000000000..f7bdd31f30
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/miscellaneous/disable/DisableTest.java
@@ -0,0 +1,58 @@
+package com.baeldung.jacksonannotation.miscellaneous.disable;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class DisableTest {
+
+ @Test
+ public void whenSerializingUsingDisable_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Author author = new Author("Alex", "Theedom");
+
+ // act
+ ObjectMapper mapper = new ObjectMapper();
+ String result = mapper.writeValueAsString(author);
+
+ // assert
+ assertThat(from(result).getList("items")).isNull();
+
+ /*
+ {
+ "lastName": "Theedom",
+ "firstName": "Alex",
+ "id": "de4afbb4-b24d-45c8-bb00-fd6b9acb42f1"
+ }
+ */
+
+ // act
+ mapper = new ObjectMapper();
+ mapper.disable(MapperFeature.USE_ANNOTATIONS);
+ result = mapper.writeValueAsString(author);
+
+ // assert
+ assertThat(from(result).getList("items")).isNotNull();
+
+ /*
+ {
+ "id": "81e6ed72-6b27-4fe9-a36f-e3171c5b55ef",
+ "firstName": "Alex",
+ "lastName": "Theedom",
+ "items": []
+ }
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/miscellaneous/mixin/MixInTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/miscellaneous/mixin/MixInTest.java
new file mode 100644
index 0000000000..779031cfa6
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/miscellaneous/mixin/MixInTest.java
@@ -0,0 +1,58 @@
+package com.baeldung.jacksonannotation.miscellaneous.mixin;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.util.List;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class MixInTest {
+
+ @Test
+ public void whenSerializingUsingMixIn_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Author author = new Author("Alex", "Theedom");
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(author);
+
+ // assert
+ assertThat(from(result).getList("items")).isNotNull();
+
+ /*
+ {
+ "id": "f848b076-00a4-444a-a50b-328595dd9bf5",
+ "firstName": "Alex",
+ "lastName": "Theedom",
+ "items": []
+ }
+ */
+
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.addMixIn(List.class, IgnoreListMixIn.class);
+
+ result = mapper.writeValueAsString(author);
+
+ // assert
+ assertThat(from(result).getList("items")).isNull();
+
+ /*
+ {
+ "id": "9ffefb7d-e56f-447c-9009-e92e142f8347",
+ "firstName": "Alex",
+ "lastName": "Theedom"
+ }
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/polymorphism/PolymorphismTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/polymorphism/PolymorphismTest.java
new file mode 100644
index 0000000000..ad7aeb937c
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/polymorphism/PolymorphismTest.java
@@ -0,0 +1,64 @@
+package com.baeldung.jacksonannotation.polymorphism;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class PolymorphismTest {
+
+ @Test
+ public void whenSerializingUsingPolymorphism_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Order.InternalType internalType = new Order.InternalType();
+ internalType.id = 250;
+ internalType.name = "staff";
+
+ Order order = new Order(internalType);
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(order);
+
+ // assert
+ assertThat(from(result).getString("type.ordertype")).isEqualTo("internal");
+
+ /*
+ {
+ "id": "7fc898e3-b4e7-41b0-8ffa-664cf3663f2e",
+ "type": {
+ "ordertype": "internal",
+ "id": 250,
+ "name": "staff"
+ }
+ }
+ */
+
+ }
+
+ @Test
+ public void whenDeserializingPolymorphic_thenCorrect() throws IOException {
+
+ // arrange
+ String orderJson = "{\"type\":{\"ordertype\":\"internal\",\"id\":100,\"name\":\"directors\"}}";
+
+ // act
+ Order order = new ObjectMapper().readerFor(Order.class).readValue(orderJson);
+
+ // assert
+ assertThat(from(orderJson).getString("type.ordertype")).isEqualTo("internal");
+ assertThat(((Order.InternalType) order.getType()).name).isEqualTo("directors");
+ assertThat(((Order.InternalType) order.getType()).id).isEqualTo(100);
+ assertThat(order.getType().getClass()).isEqualTo(Order.InternalType.class);
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonanygetter/JsonAnyGetterTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonanygetter/JsonAnyGetterTest.java
new file mode 100644
index 0000000000..de7c9b6d69
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonanygetter/JsonAnyGetterTest.java
@@ -0,0 +1,49 @@
+package com.baeldung.jacksonannotation.serialization.jsonanygetter;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.util.Map;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonAnyGetterTest {
+
+ @Test
+ public void whenSerializingUsingJsonAnyGetter_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Inventory inventory = new Inventory();
+ Map countryDeliveryCost = inventory.getCountryDeliveryCost();
+ inventory.setLocation("France");
+
+ countryDeliveryCost.put("USA", 10.00f);
+ countryDeliveryCost.put("UK", 15.00f);
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(inventory);
+
+ // assert
+ assertThat(from(result).getString("location")).isEqualTo("France");
+ assertThat(from(result).getFloat("USA")).isEqualTo(10.00f);
+ assertThat(from(result).getFloat("UK")).isEqualTo(15.00f);
+
+ /*
+ {
+ "location": "France",
+ "USA": 10,
+ "UK": 15
+ }
+ */
+
+ }
+
+}
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsongetter/JsonGetterTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsongetter/JsonGetterTest.java
new file mode 100644
index 0000000000..1eec307afa
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsongetter/JsonGetterTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.jacksonannotation.serialization.jsongetter;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonGetterTest {
+
+ @Test
+ public void whenSerializingUsingJsonGetter_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Author author = new Author("Alex", "Theedom");
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(author);
+
+ // assert
+ assertThat(from(result).getList("publications")).isNotNull();
+ assertThat(from(result).getList("items")).isNull();
+
+ /*
+ {
+ "firstName": "Alex",
+ "lastName": "Theedom",
+ "publications": []
+ }
+ */
+
+ }
+}
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonpropertyorder/JsonPropertyOrderTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonpropertyorder/JsonPropertyOrderTest.java
new file mode 100644
index 0000000000..864168bdef
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonpropertyorder/JsonPropertyOrderTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.jacksonannotation.serialization.jsonpropertyorder;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import static io.restassured.module.jsv.JsonSchemaValidator.matchesJsonSchemaInClasspath;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonPropertyOrderTest {
+
+ @Test
+ public void whenSerializingUsingJsonPropertyOrder_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Author author = new Author("Alex", "Theedom");
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(author);
+
+ // assert
+ assertThat(result, matchesJsonSchemaInClasspath("author-jsonpropertyorder-schema.json"));
+
+ // NOTE: property order is not enforced by the JSON specification.
+
+ /*
+ {
+ "items": [],
+ "firstName": "Alex",
+ "lastName": "Theedom",
+ "id": "fd277638-9b6e-49f7-81c1-bc52f165245b"
+ }
+ */
+
+ }
+}
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonrawvalue/JsonRawValueTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonrawvalue/JsonRawValueTest.java
new file mode 100644
index 0000000000..477d33762b
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonrawvalue/JsonRawValueTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.jacksonannotation.serialization.jsonrawvalue;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonRawValueTest {
+
+ @Test
+ public void whenSerializingUsingJsonRawValue_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ String customerConfig = "{\"colour\":\"red\",\"device\":\"mobile\",\"orientation\":\"landscape\"}";
+ Customer customer = new Customer("Alex", "Theedom");
+ customer.setConfiguration("{\"colour\":\"red\",\"device\":\"mobile\",\"orientation\":\"landscape\"}");
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(customer);
+
+ // assert
+ assertThat(result.contains(customerConfig));
+
+
+ /*
+ {
+ "firstName": "Alex",
+ "lastName": "Theedom",
+ "publications": []
+ }
+ */
+
+ }
+}
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonrootname/JsonRootNameTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonrootname/JsonRootNameTest.java
new file mode 100644
index 0000000000..c73dcd8e62
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonrootname/JsonRootNameTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.jacksonannotation.serialization.jsonrootname;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import org.junit.Test;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonRootNameTest {
+
+ @Test
+ public void whenSerializingUsingJsonRootName_thenCorrect() throws JsonProcessingException {
+
+ // arrange
+ Author author = new Author("Alex", "Theedom");
+
+ // act
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
+ String result = mapper.writeValueAsString(author);
+
+ // assert
+ assertThat(from(result).getString("writer.firstName")).isEqualTo("Alex");
+ assertThat(from(result).getString("author.firstName")).isNull();
+
+ /*
+ {
+ "writer": {
+ "id": "0f50dca6-3dd7-4801-a334-fd1614276389",
+ "firstName": "Alex",
+ "lastName": "Theedom",
+ "items": []
+ }
+ }
+ */
+
+ }
+}
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonserialize/JsonSerializeTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonserialize/JsonSerializeTest.java
new file mode 100644
index 0000000000..8fa03418cc
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonserialize/JsonSerializeTest.java
@@ -0,0 +1,58 @@
+package com.baeldung.jacksonannotation.serialization.jsonserialize;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+
+import static io.restassured.path.json.JsonPath.from;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonSerializeTest {
+
+ @Test
+ public void whenSerializingUsingJsonSerialize_thenCorrect() throws JsonProcessingException, ParseException {
+
+ // arrange
+ Author joshuaBloch = new Author("Joshua", "Bloch");
+ Book book = new Book("Effective Java", joshuaBloch);
+
+ SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
+ String toParse = "25-12-2017 13:30:25";
+ book.setPublished(df.parse(toParse));
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(book);
+
+ // assert
+ assertThat(from(result).getString("published")).isEqualTo(toParse);
+
+ /*
+ {
+ "id": "957c43f2-fa2e-42f9-bf75-6e3d5bb6960a",
+ "title": "Effective Java",
+ "authors": [
+ {
+ "id": "9bcd817d-0141-42e6-8f04-e5aaab0980b6",
+ "firstName": "Joshua",
+ "lastName": "Bloch",
+ "items": []
+ }
+ ],
+ "price": 0,
+ "published": "25-12-2017 13:30:25",
+ "pages": null,
+ "isbn": null
+ }
+ */
+
+ }
+}
diff --git a/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonvalue/JsonValueTest.java b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonvalue/JsonValueTest.java
new file mode 100644
index 0000000000..1dceb3bfea
--- /dev/null
+++ b/jackson-annotations/src/test/java/com/baeldung/jacksonannotation/serialization/jsonvalue/JsonValueTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.jacksonannotation.serialization.jsonvalue;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Source code github.com/readlearncode
+ *
+ * @author Alex Theedom www.readlearncode.com
+ * @version 1.0
+ */
+public class JsonValueTest {
+
+ @Test
+ public void whenSerializingUsingJsonValue_thenCorrect() throws JsonProcessingException {
+
+ // act
+ String result = new ObjectMapper().writeValueAsString(Course.Level.ADVANCED);
+
+ // assert
+ assertThat(result).isEqualTo("\"Advanced\"");
+
+ }
+}
\ No newline at end of file
diff --git a/jackson-annotations/src/test/resources/author-jsonpropertyorder-schema.json b/jackson-annotations/src/test/resources/author-jsonpropertyorder-schema.json
new file mode 100644
index 0000000000..8e7a85372c
--- /dev/null
+++ b/jackson-annotations/src/test/resources/author-jsonpropertyorder-schema.json
@@ -0,0 +1,29 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Author",
+ "description": "An author",
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "object"
+ }
+ },
+ "firstName": {
+ "type": "string"
+ },
+ "lastName": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "items",
+ "firstName",
+ "lastName",
+ "id"
+ ]
+}
\ No newline at end of file
diff --git a/javax-servlets/.gitignore b/javax-servlets/.gitignore
new file mode 100644
index 0000000000..a51a433798
--- /dev/null
+++ b/javax-servlets/.gitignore
@@ -0,0 +1,5 @@
+# Created by .ignore support plugin (hsz.mobi)
+.idea
+classes
+target
+*.iml
\ No newline at end of file
diff --git a/javax-servlets/pom.xml b/javax-servlets/pom.xml
new file mode 100644
index 0000000000..4fe4575e48
--- /dev/null
+++ b/javax-servlets/pom.xml
@@ -0,0 +1,39 @@
+
+
+ 4.0.0
+
+ com.root
+ ServletmavenExample
+ 1.0-SNAPSHOT
+
+
+
+
+ javax.servlet
+ javax.servlet-api
+ ${javax.servlet.version}
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+ org.apache.httpcomponents
+ httpclient
+ ${org.apache.httpcomponents.version}
+ test
+
+
+
+
+
+ 3.1.0
+ 4.12
+ 4.5
+
+
+
\ No newline at end of file
diff --git a/javax-servlets/src/main/java/com/root/FormServlet.java b/javax-servlets/src/main/java/com/root/FormServlet.java
new file mode 100644
index 0000000000..4f55a02745
--- /dev/null
+++ b/javax-servlets/src/main/java/com/root/FormServlet.java
@@ -0,0 +1,47 @@
+package com.root;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@WebServlet(name = "FormServlet", urlPatterns = "/calculateServlet")
+public class FormServlet extends HttpServlet {
+
+ @Override
+ protected void doPost(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+
+ String height = request.getParameter("height");
+ String weight = request.getParameter("weight");
+
+ try {
+ double bmi = calculateBMI(Double.parseDouble(weight), Double.parseDouble(height));
+
+ request.setAttribute("bmi", bmi);
+ response.setHeader("Test", "Success");
+ response.setHeader("BMI", String.valueOf(bmi));
+
+ RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
+ dispatcher.forward(request, response);
+ } catch (Exception e) {
+
+ response.sendRedirect("index.jsp");
+ }
+ }
+
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+
+ // do something else here
+ }
+
+ private Double calculateBMI(Double weight, Double height) {
+
+ return weight / (height * height);
+ }
+}
\ No newline at end of file
diff --git a/javax-servlets/src/test/java/com/root/FormServletTest.java b/javax-servlets/src/test/java/com/root/FormServletTest.java
new file mode 100644
index 0000000000..437741e12d
--- /dev/null
+++ b/javax-servlets/src/test/java/com/root/FormServletTest.java
@@ -0,0 +1,34 @@
+package com.root;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.message.BasicNameValuePair;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class FormServletTest {
+
+ @Test
+ public void whenPostRequestUsingHttpClient_thenCorrect() throws Exception {
+
+ HttpClient client = new DefaultHttpClient();
+ HttpPost method = new HttpPost("http://localhost:8080/calculateServlet");
+
+ List nvps = new ArrayList();
+ nvps.add(new BasicNameValuePair("height", String.valueOf(2)));
+ nvps.add(new BasicNameValuePair("weight", String.valueOf(80)));
+
+ method.setEntity(new UrlEncodedFormEntity(nvps));
+ HttpResponse httpResponse = client.execute(method);
+
+ assertEquals("Success", httpResponse.getHeaders("Test")[0].getValue());
+ assertEquals("20.0", httpResponse.getHeaders("BMI")[0].getValue());
+ }
+}
diff --git a/javax-servlets/web/WEB-INF/web.xml b/javax-servlets/web/WEB-INF/web.xml
new file mode 100644
index 0000000000..66934d8fd3
--- /dev/null
+++ b/javax-servlets/web/WEB-INF/web.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/javax-servlets/web/index.jsp b/javax-servlets/web/index.jsp
new file mode 100644
index 0000000000..5a2e018a41
--- /dev/null
+++ b/javax-servlets/web/index.jsp
@@ -0,0 +1,26 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+
+ Calculate BMI
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index b8d0303160..1dde581d13 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,9 @@
immutables
jackson
+ jackson-annotations
java-cassandra
+ javax-servlets
javaxval
jee7
jjwt
@@ -109,6 +111,7 @@
spring-katharsis
spring-mockito
spring-mvc-java
+ spring-mvc-forms
spring-mvc-no-xml
spring-mvc-tiles
spring-mvc-velocity
diff --git a/spring-core/README.md b/spring-core/README.md
index 53842ecb1a..f05ba9384f 100644
--- a/spring-core/README.md
+++ b/spring-core/README.md
@@ -1,3 +1,5 @@
### Relevant Articles:
- [Wiring in Spring: @Autowired, @Resource and @Inject](http://www.baeldung.com/spring-annotations-resource-inject-autowire)
- [Exploring the Spring BeanFactory API](http://www.baeldung.com/spring-beanfactory)
+- [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean)
+
diff --git a/spring-core/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java b/spring-core/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java
index 40e181b7a7..e5e6d2ec05 100644
--- a/spring-core/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java
+++ b/spring-core/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java
@@ -6,21 +6,11 @@ import org.springframework.context.annotation.Configuration;
@Configuration
public class FactoryBeanAppConfig {
- @Bean
- public ToolFactory tool() {
+ @Bean(name = "tool")
+ public ToolFactory toolFactory() {
ToolFactory factory = new ToolFactory();
factory.setFactoryId(7070);
factory.setToolId(2);
- factory.setToolName("wrench");
- factory.setToolPrice(3.7);
return factory;
}
-
- @Bean
- public Worker worker() throws Exception {
- Worker worker = new Worker();
- worker.setNumber("1002");
- worker.setTool(tool().getObject());
- return worker;
- }
-}
+}
\ No newline at end of file
diff --git a/spring-core/src/main/java/com/baeldung/factorybean/InitializationToolFactory.java b/spring-core/src/main/java/com/baeldung/factorybean/InitializationToolFactory.java
deleted file mode 100644
index 15e2b01f49..0000000000
--- a/spring-core/src/main/java/com/baeldung/factorybean/InitializationToolFactory.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.baeldung.factorybean;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import org.springframework.beans.factory.FactoryBean;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.util.StringUtils;
-
-public class InitializationToolFactory implements FactoryBean, InitializingBean {
-
- private int factoryId;
- private int toolId;
- private String toolName;
- private double toolPrice;
-
- @Override
- public void afterPropertiesSet() throws Exception {
- checkArgument(!StringUtils.isEmpty(toolName), "tool name cannot be empty");
- checkArgument(toolPrice >= 0, "tool price should not be less than 0");
- }
-
- @Override
- public Tool getObject() throws Exception {
- return new Tool(toolId, toolName, toolPrice);
- }
-
- @Override
- public Class> getObjectType() {
- return Tool.class;
- }
-
- @Override
- public boolean isSingleton() {
- return false;
- }
-
- public int getFactoryId() {
- return factoryId;
- }
-
- public void setFactoryId(int factoryId) {
- this.factoryId = factoryId;
- }
-
- public int getToolId() {
- return toolId;
- }
-
- public void setToolId(int toolId) {
- this.toolId = toolId;
- }
-
- public String getToolName() {
- return toolName;
- }
-
- public void setToolName(String toolName) {
- this.toolName = toolName;
- }
-
- public double getToolPrice() {
- return toolPrice;
- }
-
- public void setToolPrice(double toolPrice) {
- this.toolPrice = toolPrice;
- }
-}
diff --git a/spring-core/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java b/spring-core/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java
index 158318649c..981df2206f 100644
--- a/spring-core/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java
+++ b/spring-core/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java
@@ -6,8 +6,6 @@ public class NonSingleToolFactory extends AbstractFactoryBean {
private int factoryId;
private int toolId;
- private String toolName;
- private double toolPrice;
public NonSingleToolFactory() {
setSingleton(false);
@@ -20,7 +18,7 @@ public class NonSingleToolFactory extends AbstractFactoryBean {
@Override
protected Tool createInstance() throws Exception {
- return new Tool(toolId, toolName, toolPrice);
+ return new Tool(toolId);
}
public int getFactoryId() {
@@ -38,20 +36,4 @@ public class NonSingleToolFactory extends AbstractFactoryBean {
public void setToolId(int toolId) {
this.toolId = toolId;
}
-
- public String getToolName() {
- return toolName;
- }
-
- public void setToolName(String toolName) {
- this.toolName = toolName;
- }
-
- public double getToolPrice() {
- return toolPrice;
- }
-
- public void setToolPrice(double toolPrice) {
- this.toolPrice = toolPrice;
- }
}
diff --git a/spring-core/src/main/java/com/baeldung/factorybean/PostConstructToolFactory.java b/spring-core/src/main/java/com/baeldung/factorybean/PostConstructToolFactory.java
deleted file mode 100644
index 696545a70a..0000000000
--- a/spring-core/src/main/java/com/baeldung/factorybean/PostConstructToolFactory.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.baeldung.factorybean;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import javax.annotation.PostConstruct;
-
-import org.springframework.beans.factory.FactoryBean;
-import org.springframework.util.StringUtils;
-
-public class PostConstructToolFactory implements FactoryBean {
-
- private int factoryId;
- private int toolId;
- private String toolName;
- private double toolPrice;
-
- @Override
- public Tool getObject() throws Exception {
- return new Tool(toolId, toolName, toolPrice);
- }
-
- @Override
- public Class> getObjectType() {
- return Tool.class;
- }
-
- @Override
- public boolean isSingleton() {
- return false;
- }
-
- @PostConstruct
- public void checkParams() {
- checkArgument(!StringUtils.isEmpty(toolName), "tool name cannot be empty");
- checkArgument(toolPrice >= 0, "tool price should not be less than 0");
- }
-
- public int getFactoryId() {
- return factoryId;
- }
-
- public void setFactoryId(int factoryId) {
- this.factoryId = factoryId;
- }
-
- public int getToolId() {
- return toolId;
- }
-
- public void setToolId(int toolId) {
- this.toolId = toolId;
- }
-
- public String getToolName() {
- return toolName;
- }
-
- public void setToolName(String toolName) {
- this.toolName = toolName;
- }
-
- public double getToolPrice() {
- return toolPrice;
- }
-
- public void setToolPrice(double toolPrice) {
- this.toolPrice = toolPrice;
- }
-}
diff --git a/spring-core/src/main/java/com/baeldung/factorybean/SingleToolFactory.java b/spring-core/src/main/java/com/baeldung/factorybean/SingleToolFactory.java
index 37fd978a3c..76b87bbbbf 100644
--- a/spring-core/src/main/java/com/baeldung/factorybean/SingleToolFactory.java
+++ b/spring-core/src/main/java/com/baeldung/factorybean/SingleToolFactory.java
@@ -7,8 +7,6 @@ public class SingleToolFactory extends AbstractFactoryBean {
private int factoryId;
private int toolId;
- private String toolName;
- private double toolPrice;
@Override
public Class> getObjectType() {
@@ -17,7 +15,7 @@ public class SingleToolFactory extends AbstractFactoryBean {
@Override
protected Tool createInstance() throws Exception {
- return new Tool(toolId, toolName, toolPrice);
+ return new Tool(toolId);
}
public int getFactoryId() {
@@ -35,20 +33,4 @@ public class SingleToolFactory extends AbstractFactoryBean {
public void setToolId(int toolId) {
this.toolId = toolId;
}
-
- public String getToolName() {
- return toolName;
- }
-
- public void setToolName(String toolName) {
- this.toolName = toolName;
- }
-
- public double getToolPrice() {
- return toolPrice;
- }
-
- public void setToolPrice(double toolPrice) {
- this.toolPrice = toolPrice;
- }
}
diff --git a/spring-core/src/main/java/com/baeldung/factorybean/Tool.java b/spring-core/src/main/java/com/baeldung/factorybean/Tool.java
index 2a69cbaf2a..be56745b3d 100644
--- a/spring-core/src/main/java/com/baeldung/factorybean/Tool.java
+++ b/spring-core/src/main/java/com/baeldung/factorybean/Tool.java
@@ -1,15 +1,13 @@
package com.baeldung.factorybean;
public class Tool {
-
private int id;
- private String name;
- private double price;
- public Tool(int id, String name, double price) {
+ public Tool() {
+ }
+
+ public Tool(int id) {
this.id = id;
- this.name = name;
- this.price = price;
}
public int getId() {
@@ -19,20 +17,4 @@ public class Tool {
public void setId(int id) {
this.id = id;
}
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public double getPrice() {
- return price;
- }
-
- public void setPrice(double price) {
- this.price = price;
- }
}
diff --git a/spring-core/src/main/java/com/baeldung/factorybean/ToolFactory.java b/spring-core/src/main/java/com/baeldung/factorybean/ToolFactory.java
index 5e6385c679..2a17574f8e 100644
--- a/spring-core/src/main/java/com/baeldung/factorybean/ToolFactory.java
+++ b/spring-core/src/main/java/com/baeldung/factorybean/ToolFactory.java
@@ -6,12 +6,10 @@ public class ToolFactory implements FactoryBean {
private int factoryId;
private int toolId;
- private String toolName;
- private double toolPrice;
@Override
public Tool getObject() throws Exception {
- return new Tool(toolId, toolName, toolPrice);
+ return new Tool(toolId);
}
@Override
@@ -39,20 +37,4 @@ public class ToolFactory implements FactoryBean {
public void setToolId(int toolId) {
this.toolId = toolId;
}
-
- public String getToolName() {
- return toolName;
- }
-
- public void setToolName(String toolName) {
- this.toolName = toolName;
- }
-
- public double getToolPrice() {
- return toolPrice;
- }
-
- public void setToolPrice(double toolPrice) {
- this.toolPrice = toolPrice;
- }
}
diff --git a/spring-core/src/main/java/com/baeldung/factorybean/Worker.java b/spring-core/src/main/java/com/baeldung/factorybean/Worker.java
deleted file mode 100644
index 0d1dc5d7d6..0000000000
--- a/spring-core/src/main/java/com/baeldung/factorybean/Worker.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.baeldung.factorybean;
-
-public class Worker {
-
- private String number;
- private Tool tool;
-
- public Worker() {}
-
- public Worker(String number, Tool tool) {
- this.number = number;
- this.tool = tool;
- }
-
- public String getNumber() {
- return number;
- }
-
- public void setNumber(String number) {
- this.number = number;
- }
-
- public Tool getTool() {
- return tool;
- }
-
- public void setTool(Tool tool) {
- this.tool = tool;
- }
-}
diff --git a/spring-core/src/main/resources/factorybean-abstract-spring-ctx.xml b/spring-core/src/main/resources/factorybean-abstract-spring-ctx.xml
index 33b3051cae..a82b884ee5 100644
--- a/spring-core/src/main/resources/factorybean-abstract-spring-ctx.xml
+++ b/spring-core/src/main/resources/factorybean-abstract-spring-ctx.xml
@@ -6,34 +6,10 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-core/src/main/resources/factorybean-init-spring-ctx.xml b/spring-core/src/main/resources/factorybean-init-spring-ctx.xml
deleted file mode 100644
index 1ff492e5df..0000000000
--- a/spring-core/src/main/resources/factorybean-init-spring-ctx.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-core/src/main/resources/factorybean-postconstruct-spring-ctx.xml b/spring-core/src/main/resources/factorybean-postconstruct-spring-ctx.xml
deleted file mode 100644
index f34325160f..0000000000
--- a/spring-core/src/main/resources/factorybean-postconstruct-spring-ctx.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-core/src/main/resources/factorybean-spring-ctx.xml b/spring-core/src/main/resources/factorybean-spring-ctx.xml
index 2987b67d94..3231fda676 100644
--- a/spring-core/src/main/resources/factorybean-spring-ctx.xml
+++ b/spring-core/src/main/resources/factorybean-spring-ctx.xml
@@ -6,12 +6,5 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-core/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanTest.java b/spring-core/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanTest.java
index a7ba6d9a68..aa6d7c2cd2 100644
--- a/spring-core/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanTest.java
+++ b/spring-core/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanTest.java
@@ -4,33 +4,36 @@ import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
-import org.junit.Test;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
+import javax.annotation.Resource;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { "classpath:factorybean-abstract-spring-ctx.xml" })
public class AbstractFactoryBeanTest {
-
+
+ @Resource(name = "singleTool")
+ private Tool tool1;
+ @Resource(name = "singleTool")
+ private Tool tool2;
+ @Resource(name = "nonSingleTool")
+ private Tool tool3;
+ @Resource(name = "nonSingleTool")
+ private Tool tool4;
+
@Test
public void testSingleToolFactory() {
- ApplicationContext context = new ClassPathXmlApplicationContext("classpath:factorybean-abstract-spring-ctx.xml");
-
- Worker worker1 = (Worker) context.getBean("worker1");
- Worker worker2 = (Worker) context.getBean("worker2");
-
- assertThat(worker1.getNumber(), equalTo("50001"));
- assertThat(worker2.getNumber(), equalTo("50002"));
- assertTrue(worker1.getTool() == worker2.getTool());
+ assertThat(tool1.getId(), equalTo(1));
+ assertTrue(tool1 == tool2);
}
@Test
public void testNonSingleToolFactory() {
- ApplicationContext context = new ClassPathXmlApplicationContext("classpath:factorybean-abstract-spring-ctx.xml");
-
- Worker worker3 = (Worker) context.getBean("worker3");
- Worker worker4 = (Worker) context.getBean("worker4");
-
- assertThat(worker3.getNumber(), equalTo("50003"));
- assertThat(worker4.getNumber(), equalTo("50004"));
- assertTrue(worker3.getTool() != worker4.getTool());
+ assertThat(tool3.getId(), equalTo(2));
+ assertThat(tool4.getId(), equalTo(2));
+ assertTrue(tool3 != tool4);
}
}
diff --git a/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanInitializeTest.java b/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanInitializeTest.java
deleted file mode 100644
index 87947b148a..0000000000
--- a/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanInitializeTest.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.baeldung.factorybean;
-
-import org.junit.Test;
-import org.springframework.beans.factory.BeanCreationException;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-public class FactoryBeanInitializeTest {
-
- @Test(expected = BeanCreationException.class)
- public void testInitializationToolFactory() {
- new ClassPathXmlApplicationContext("classpath:factorybean-init-spring-ctx.xml");
- }
-
- @Test(expected = BeanCreationException.class)
- public void testPostConstructToolFactory() {
- new ClassPathXmlApplicationContext("classpath:factorybean-postconstruct-spring-ctx.xml");
- }
-}
diff --git a/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigTest.java b/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigTest.java
new file mode 100644
index 0000000000..c725f786dc
--- /dev/null
+++ b/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.factorybean;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import javax.annotation.Resource;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = FactoryBeanAppConfig.class)
+public class FactoryBeanJavaConfigTest {
+
+ @Autowired
+ private Tool tool;
+
+ @Resource(name = "&tool")
+ private ToolFactory toolFactory;
+
+ @Test
+ public void testConstructWorkerByJava() {
+ assertThat(tool.getId(), equalTo(2));
+ assertThat(toolFactory.getFactoryId(), equalTo(7070));
+ }
+}
\ No newline at end of file
diff --git a/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanTest.java b/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanTest.java
deleted file mode 100644
index f35503794a..0000000000
--- a/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.baeldung.factorybean;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
-
-import org.junit.Test;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.annotation.AnnotationConfigApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-public class FactoryBeanTest {
-
- @Test
- public void testConstructWorkerByXml() {
- ApplicationContext context = new ClassPathXmlApplicationContext("classpath:factorybean-spring-ctx.xml");
-
- Worker worker = (Worker) context.getBean("worker");
- assertThat(worker.getNumber(), equalTo("1001"));
- assertThat(worker.getTool().getId(), equalTo(1));
- assertThat(worker.getTool().getName(), equalTo("screwdriver"));
- assertThat(worker.getTool().getPrice(), equalTo(1.5));
-
- ToolFactory toolFactory = (ToolFactory) context.getBean("&tool");
- assertThat(toolFactory.getFactoryId(), equalTo(9090));
- }
-
- @Test
- public void testConstructWorkerByJava() {
- ApplicationContext context = new AnnotationConfigApplicationContext(FactoryBeanAppConfig.class);
-
- Worker worker = (Worker) context.getBean("worker");
- assertThat(worker.getNumber(), equalTo("1002"));
- assertThat(worker.getTool().getId(), equalTo(2));
- assertThat(worker.getTool().getName(), equalTo("wrench"));
- assertThat(worker.getTool().getPrice(), equalTo(3.7));
-
- ToolFactory toolFactory = (ToolFactory) context.getBean("&tool");
- assertThat(toolFactory.getFactoryId(), equalTo(7070));
- }
-}
diff --git a/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigTest.java b/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigTest.java
new file mode 100644
index 0000000000..443515f872
--- /dev/null
+++ b/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigTest.java
@@ -0,0 +1,28 @@
+package com.baeldung.factorybean;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+import javax.annotation.Resource;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { "classpath:factorybean-spring-ctx.xml" })
+public class FactoryBeanXmlConfigTest {
+
+ @Autowired
+ private Tool tool;
+ @Resource(name = "&tool")
+ private ToolFactory toolFactory;
+
+ @Test
+ public void testConstructWorkerByXml() {
+ assertThat(tool.getId(), equalTo(1));
+ assertThat(toolFactory.getFactoryId(), equalTo(9090));
+ }
+}
\ No newline at end of file
diff --git a/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java b/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java
index 3ca0dbf5e4..8768bac58c 100644
--- a/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java
+++ b/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java
@@ -40,7 +40,7 @@ public class PersistenceJPAConfigL2Cache {
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
- em.setPackagesToScan(new String[] { "org.baeldung.persistence.model" });
+ em.setPackagesToScan(getPackagesToScan());
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
@@ -49,6 +49,10 @@ public class PersistenceJPAConfigL2Cache {
return em;
}
+ protected String[] getPackagesToScan() {
+ return new String[] { "org.baeldung.persistence.model" };
+ }
+
@Bean
public DataSource dataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
@@ -78,6 +82,7 @@ public class PersistenceJPAConfigL2Cache {
hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", env.getProperty("hibernate.cache.use_second_level_cache"));
hibernateProperties.setProperty("hibernate.cache.use_query_cache", env.getProperty("hibernate.cache.use_query_cache"));
hibernateProperties.setProperty("hibernate.cache.region.factory_class", env.getProperty("hibernate.cache.region.factory_class"));
+ hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
return hibernateProperties;
}
diff --git a/spring-jpa/src/main/resources/persistence-h2.properties b/spring-jpa/src/main/resources/persistence-h2.properties
index d195af5ec9..2c3e18b58d 100644
--- a/spring-jpa/src/main/resources/persistence-h2.properties
+++ b/spring-jpa/src/main/resources/persistence-h2.properties
@@ -6,7 +6,7 @@ jdbc.user=sa
# hibernate.X
hibernate.dialect=org.hibernate.dialect.H2Dialect
-hibernate.show_sql=false
+hibernate.show_sql=true
hibernate.hbm2ddl.auto=create-drop
hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=true
diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java b/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java
new file mode 100644
index 0000000000..37388d1c51
--- /dev/null
+++ b/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java
@@ -0,0 +1,17 @@
+package org.baeldung.persistence.deletion.config;
+
+import org.baeldung.config.PersistenceJPAConfigL2Cache;
+
+import java.util.Properties;
+
+public class PersistenceJPAConfigDeletion extends PersistenceJPAConfigL2Cache {
+
+ public PersistenceJPAConfigDeletion() {
+ super();
+ }
+
+ @Override
+ protected String[] getPackagesToScan() {
+ return new String[] { "org.baeldung.persistence.deletion.model" };
+ }
+}
\ No newline at end of file
diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Bar.java b/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Bar.java
new file mode 100644
index 0000000000..26c4846fd2
--- /dev/null
+++ b/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Bar.java
@@ -0,0 +1,60 @@
+package org.baeldung.persistence.deletion.model;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+@Table(name = "BAR")
+public class Bar {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private long id;
+
+ @Column(nullable = false)
+ private String name;
+
+ @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
+ List bazList = new ArrayList<>();
+
+ public Bar() {
+ super();
+ }
+
+ public Bar(final String name) {
+ super();
+ this.name = name;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(final long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public List getBazList() {
+ return bazList;
+ }
+
+ public void setBazList(final List bazList) {
+ this.bazList = bazList;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder builder = new StringBuilder();
+ builder.append("Bar [name=").append(name).append("]");
+ return builder.toString();
+ }
+}
diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Baz.java b/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Baz.java
new file mode 100644
index 0000000000..2dad3e6654
--- /dev/null
+++ b/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Baz.java
@@ -0,0 +1,48 @@
+package org.baeldung.persistence.deletion.model;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+@Table(name = "BAZ")
+public class Baz {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private long id;
+
+ @Column(nullable = false)
+ private String name;
+
+ public Baz() {
+ super();
+ }
+
+ public Baz(final String name) {
+ super();
+ this.name = name;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(final long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder builder = new StringBuilder();
+ builder.append("Bar [name=").append(name).append("]");
+ return builder.toString();
+ }
+}
diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Foo.java b/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Foo.java
new file mode 100644
index 0000000000..00fc34c166
--- /dev/null
+++ b/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Foo.java
@@ -0,0 +1,63 @@
+package org.baeldung.persistence.deletion.model;
+
+import org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "FOO")
+@Where(clause = "DELETED = 0")
+public class Foo {
+
+ public Foo() {
+ super();
+ }
+
+ public Foo(final String name) {
+ super();
+ this.name = name;
+ }
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ @Column(name = "ID")
+ private long id;
+
+ @Column(name = "NAME")
+ private String name;
+
+ @Column(name = "DELETED")
+ private Integer deleted = 0;
+
+ @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+ @JoinColumn(name = "BAR_ID")
+ private Bar bar;
+
+ public Bar getBar() {
+ return bar;
+ }
+
+ public void setBar(final Bar bar) {
+ this.bar = bar;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(final int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public void setDeleted() {
+ this.deleted = 1;
+ }
+}
diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java b/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java
new file mode 100644
index 0000000000..9e5c5fa07a
--- /dev/null
+++ b/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java
@@ -0,0 +1,159 @@
+package org.baeldung.persistence.service;
+
+import org.baeldung.persistence.deletion.config.PersistenceJPAConfigDeletion;
+import org.baeldung.persistence.deletion.model.Bar;
+import org.baeldung.persistence.deletion.model.Baz;
+import org.baeldung.persistence.deletion.model.Foo;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { PersistenceJPAConfigDeletion.class }, loader = AnnotationConfigContextLoader.class)
+public class DeletionIntegrationTest {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+ @Autowired
+ private PlatformTransactionManager platformTransactionManager;
+
+ @Before
+ public final void before() {
+ entityManager.getEntityManagerFactory().getCache().evictAll();
+ }
+
+ @Test
+ @Transactional
+ public final void givenEntityIsRemoved_thenItIsNotInDB() {
+ Foo foo = new Foo("foo");
+ entityManager.persist(foo);
+ flushAndClear();
+
+ foo = entityManager.find(Foo.class, foo.getId());
+ assertThat(foo, notNullValue());
+
+ entityManager.remove(foo);
+ flushAndClear();
+
+ assertThat(entityManager.find(Foo.class, foo.getId()), nullValue());
+ }
+
+ @Test
+ @Transactional
+ public final void givenEntityIsRemovedAndReferencedByAnotherEntity_thenItIsNotRemoved() {
+ Bar bar = new Bar("bar");
+ Foo foo = new Foo("foo");
+ foo.setBar(bar);
+ entityManager.persist(foo);
+ flushAndClear();
+
+ foo = entityManager.find(Foo.class, foo.getId());
+ bar = entityManager.find(Bar.class, bar.getId());
+ entityManager.remove(bar);
+ flushAndClear();
+
+ bar = entityManager.find(Bar.class, bar.getId());
+ assertThat(bar, notNullValue());
+
+ foo = entityManager.find(Foo.class, foo.getId());
+ foo.setBar(null);
+ entityManager.remove(bar);
+ flushAndClear();
+
+ assertThat(entityManager.find(Bar.class, bar.getId()), nullValue());
+ }
+
+ @Test
+ @Transactional
+ public final void givenEntityIsRemoved_thenRemovalIsCascaded() {
+ Bar bar = new Bar("bar");
+ Foo foo = new Foo("foo");
+ foo.setBar(bar);
+ entityManager.persist(foo);
+ flushAndClear();
+
+ foo = entityManager.find(Foo.class, foo.getId());
+ entityManager.remove(foo);
+ flushAndClear();
+
+ assertThat(entityManager.find(Foo.class, foo.getId()), nullValue());
+ assertThat(entityManager.find(Bar.class, bar.getId()), nullValue());
+ }
+
+ @Test
+ @Transactional
+ public final void givenEntityIsDisassociated_thenOrphanRemovalIsApplied() {
+ Bar bar = new Bar("bar");
+ Baz baz = new Baz("baz");
+ bar.getBazList().add(baz);
+ entityManager.persist(bar);
+ flushAndClear();
+
+ bar = entityManager.find(Bar.class, bar.getId());
+ baz = bar.getBazList().get(0);
+ bar.getBazList().remove(baz);
+ flushAndClear();
+
+ assertThat(entityManager.find(Baz.class, baz.getId()), nullValue());
+ }
+
+ @Test
+ @Transactional
+ public final void givenEntityIsDeletedWithJpaBulkDeleteStatement_thenItIsNotInDB() {
+ Foo foo = new Foo("foo");
+ entityManager.persist(foo);
+ flushAndClear();
+
+ entityManager.createQuery("delete from Foo where id = :id")
+ .setParameter("id", foo.getId())
+ .executeUpdate();
+
+ assertThat(entityManager.find(Foo.class, foo.getId()), nullValue());
+ }
+
+ @Test
+ @Transactional
+ public final void givenEntityIsDeletedWithNativeQuery_thenItIsNotInDB() {
+ Foo foo = new Foo("foo");
+ entityManager.persist(foo);
+ flushAndClear();
+
+ entityManager.createNativeQuery("delete from FOO where ID = :id")
+ .setParameter("id", foo.getId())
+ .executeUpdate();
+
+ assertThat(entityManager.find(Foo.class, foo.getId()), nullValue());
+ }
+
+ @Test
+ @Transactional
+ public final void givenEntityIsSoftDeleted_thenItIsNotReturnedFromQueries() {
+ Foo foo = new Foo("foo");
+ entityManager.persist(foo);
+ flushAndClear();
+
+ foo = entityManager.find(Foo.class, foo.getId());
+ foo.setDeleted();
+ flushAndClear();
+
+ assertThat(entityManager.find(Foo.class, foo.getId()), nullValue());
+ }
+
+ private void flushAndClear() {
+ entityManager.flush();
+ entityManager.clear();
+ }
+}
diff --git a/spring-mvc-forms/pom.xml b/spring-mvc-forms/pom.xml
new file mode 100644
index 0000000000..370fd7feb2
--- /dev/null
+++ b/spring-mvc-forms/pom.xml
@@ -0,0 +1,99 @@
+
+
+
+ 4.0.0
+ com.baeldung
+ 0.1-SNAPSHOT
+ spring-mvc-forms
+
+ spring-mvc-forms
+ war
+
+
+
+ org.springframework
+ spring-webmvc
+ ${springframework.version}
+
+
+
+ javax.servlet
+ javax.servlet-api
+ ${javax.servlet-api.version}
+
+
+
+ javax.servlet.jsp
+ javax.servlet.jsp-api
+ ${javax.servlet.jsp-api.version}
+
+
+
+ javax.servlet
+ jstl
+ ${jstl.version}
+
+
+
+ org.hibernate
+ hibernate-validator
+ ${hibernate-validator.version}
+
+
+
+
+
+
+
+ spring-mvc-forms
+
+ true
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven-compiler-plugin.source}
+ ${maven-compiler-plugin.source}
+
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ ${maven-war-plugin.version}
+
+ src/main/webapp
+ spring-mvc-forms
+ false
+ ${deploy-path}
+
+
+
+
+
+ spring-mvc-forms
+
+
+
+
+
+ 4.0.6.RELEASE
+ 2.4
+ 1.2
+ 2.3.1
+ 3.1.0
+ 3.5.1
+ 1.8
+ 5.1.1.Final
+ enter-location-of-server
+
+
+
+
diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java
new file mode 100644
index 0000000000..998f070c02
--- /dev/null
+++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java
@@ -0,0 +1,29 @@
+package com.baeldung.springmvcforms.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.view.InternalResourceViewResolver;
+
+@Configuration
+@EnableWebMvc
+@ComponentScan(basePackages = "com.baeldung.springmvcforms")
+class ApplicationConfiguration extends WebMvcConfigurerAdapter {
+
+ @Override
+ public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
+ configurer.enable();
+ }
+
+ @Bean
+ public InternalResourceViewResolver jspViewResolver() {
+ InternalResourceViewResolver bean = new InternalResourceViewResolver();
+ bean.setPrefix("/WEB-INF/views/");
+ bean.setSuffix(".jsp");
+ return bean;
+ }
+
+}
diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java
new file mode 100644
index 0000000000..c602ea6454
--- /dev/null
+++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java
@@ -0,0 +1,47 @@
+package com.baeldung.springmvcforms.configuration;
+
+import org.springframework.web.WebApplicationInitializer;
+import org.springframework.web.context.ContextLoaderListener;
+import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
+import org.springframework.web.servlet.DispatcherServlet;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+
+public class WebInitializer implements WebApplicationInitializer {
+
+ public void onStartup(ServletContext container) throws ServletException {
+
+ AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
+ ctx.register(ApplicationConfiguration.class);
+ ctx.setServletContext(container);
+
+ // Manage the lifecycle of the root application context
+ container.addListener(new ContextLoaderListener(ctx));
+
+ ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx));
+
+ servlet.setLoadOnStartup(1);
+ servlet.addMapping("/");
+ }
+// @Override
+// public void onStartup(ServletContext container) {
+// // Create the 'root' Spring application context
+// AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
+// rootContext.register(ServiceConfig.class, JPAConfig.class, SecurityConfig.class);
+//
+// // Manage the lifecycle of the root application context
+// container.addListener(new ContextLoaderListener(rootContext));
+//
+// // Create the dispatcher servlet's Spring application context
+// AnnotationConfigWebApplicationContext dispatcherServlet = new AnnotationConfigWebApplicationContext();
+// dispatcherServlet.register(MvcConfig.class);
+//
+// // Register and map the dispatcher servlet
+// ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherServlet));
+// dispatcher.setLoadOnStartup(1);
+// dispatcher.addMapping("/");
+//
+// }
+}
diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/EmployeeController.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/EmployeeController.java
new file mode 100644
index 0000000000..3ece77bb18
--- /dev/null
+++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/EmployeeController.java
@@ -0,0 +1,41 @@
+package com.baeldung.springmvcforms.controller;
+
+import com.baeldung.springmvcforms.domain.Employee;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.validation.Valid;
+import java.util.HashMap;
+import java.util.Map;
+
+@Controller
+public class EmployeeController {
+
+ Map employeeMap = new HashMap<>();
+
+ @RequestMapping(value = "/employee", method = RequestMethod.GET)
+ public ModelAndView showForm() {
+ return new ModelAndView("employeeHome", "employee", new Employee());
+ }
+
+ @RequestMapping(value = "/employee/{Id}", produces = { "application/json", "application/xml" }, method = RequestMethod.GET)
+ public @ResponseBody Employee getEmployeeById(@PathVariable final long Id) {
+ return employeeMap.get(Id);
+ }
+
+ @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
+ public String submit(@Valid @ModelAttribute("employee") final Employee employee, final BindingResult result, final ModelMap model) {
+ if (result.hasErrors()) {
+ return "error";
+ }
+ model.addAttribute("name", employee.getName());
+ model.addAttribute("contactNumber", employee.getContactNumber());
+ model.addAttribute("id", employee.getId());
+ employeeMap.put(employee.getId(), employee);
+ return "employeeView";
+ }
+
+}
diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Employee.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Employee.java
new file mode 100644
index 0000000000..23cb72b3dc
--- /dev/null
+++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Employee.java
@@ -0,0 +1,46 @@
+package com.baeldung.springmvcforms.domain;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+public class Employee {
+
+ private long id;
+
+ @NotNull
+ @Size(min = 5)
+ private String name;
+
+ @NotNull
+ @Size(min = 7)
+ private String contactNumber;
+
+ public Employee() {
+ super();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(final long id) {
+ this.id = id;
+ }
+
+ public String getContactNumber() {
+ return contactNumber;
+ }
+
+ public void setContactNumber(final String contactNumber) {
+ this.contactNumber = contactNumber;
+ }
+
+}
diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeHome.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeHome.jsp
new file mode 100644
index 0000000000..5ed572000a
--- /dev/null
+++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeHome.jsp
@@ -0,0 +1,33 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
+
+
+
+Form Example - Register an Employee
+
+
+
Welcome, Enter The Employee Details
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeView.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeView.jsp
new file mode 100644
index 0000000000..1457bc5fc8
--- /dev/null
+++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeView.jsp
@@ -0,0 +1,24 @@
+<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+
+
+Spring MVC Form Handling
+
+
+
+ Submitted Employee Information
+
+
+ Name : |
+ ${name} |
+
+
+ ID : |
+ ${id} |
+
+
+ Contact Number : |
+ ${contactNumber} |
+
+
+
+
\ No newline at end of file
diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/error.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/error.jsp
new file mode 100644
index 0000000000..8f3d83af17
--- /dev/null
+++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/error.jsp
@@ -0,0 +1,20 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+
+
+
+
+SpringMVCExample
+
+
+
+ Pleas enter the correct details
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/templates/message.html b/spring-mvc-java/src/main/webapp/WEB-INF/templates/message.html
new file mode 100644
index 0000000000..291e8312ae
--- /dev/null
+++ b/spring-mvc-java/src/main/webapp/WEB-INF/templates/message.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitTest.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitTest.java
new file mode 100644
index 0000000000..46a95ae694
--- /dev/null
+++ b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitTest.java
@@ -0,0 +1,34 @@
+package com.baeldung.htmlunit;
+
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class HtmlUnitAndJUnitTest {
+
+ private WebClient webClient;
+
+ @Before
+ public void init() throws Exception {
+ webClient = new WebClient();
+ }
+
+ @After
+ public void close() throws Exception {
+ webClient.close();
+ }
+
+ @Test
+ public void givenAClient_whenEnteringBaeldung_thenPageTitleIsOk()
+ throws Exception {
+ webClient.getOptions().setThrowExceptionOnScriptError(false);
+ HtmlPage page = webClient.getPage("http://www.baeldung.com/");
+ Assert.assertEquals(
+ "Baeldung | Java, Spring and Web Development tutorials",
+ page.getTitleText());
+ }
+
+}
diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringIntegrationTest.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringIntegrationTest.java
deleted file mode 100644
index 406975b6cc..0000000000
--- a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringIntegrationTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.baeldung.htmlunit;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
-import org.springframework.test.web.servlet.htmlunit.MockMvcWebClientBuilder;
-import org.springframework.web.context.WebApplicationContext;
-
-import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
-import com.gargoylesoftware.htmlunit.WebClient;
-import com.gargoylesoftware.htmlunit.html.HtmlForm;
-import com.gargoylesoftware.htmlunit.html.HtmlPage;
-import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
-import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@WebAppConfiguration
-@ContextConfiguration(classes = { TestConfig.class })
-public class HtmlUnitAndSpringIntegrationTest {
-
- @Autowired
- private WebApplicationContext wac;
-
- private WebClient webClient;
-
- @Before
- public void setup() {
- webClient = MockMvcWebClientBuilder.webAppContextSetup(wac).build();
- }
-
- //
-
- @Test
- @Ignore("Related view message.html does not exist check MessageController")
- public void givenAMessage_whenSent_thenItShows() throws FailingHttpStatusCodeException, MalformedURLException, IOException {
- final String text = "Hello world!";
- final HtmlPage page = webClient.getPage("http://localhost/message/showForm");
- System.out.println(page.asXml());
-
- final HtmlTextInput messageText = page.getHtmlElementById("message");
- messageText.setValueAttribute(text);
-
- final HtmlForm form = page.getForms().get(0);
- final HtmlSubmitInput submit = form.getOneHtmlElementByAttribute("input", "type", "submit");
- final HtmlPage newPage = submit.click();
-
- final String receivedText = newPage.getHtmlElementById("received").getTextContent();
-
- Assert.assertEquals(receivedText, text);
- System.out.println(newPage.asXml());
- }
-
- @Test
- public void givenAClient_whenEnteringBaeldung_thenPageTitleIsCorrect() throws Exception {
- try (final WebClient client = new WebClient()) {
- webClient.getOptions().setThrowExceptionOnScriptError(false);
-
- final HtmlPage page = webClient.getPage("http://www.baeldung.com/");
- Assert.assertEquals("Baeldung | Java, Spring and Web Development tutorials", page.getTitleText());
- }
- }
-
-}
diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringTest.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringTest.java
new file mode 100644
index 0000000000..45e441f47f
--- /dev/null
+++ b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringTest.java
@@ -0,0 +1,61 @@
+package com.baeldung.htmlunit;
+
+import java.io.IOException;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.htmlunit.MockMvcWebClientBuilder;
+import org.springframework.web.context.WebApplicationContext;
+
+import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration
+@ContextConfiguration(classes = { TestConfig.class })
+public class HtmlUnitAndSpringTest {
+
+ @Autowired
+ private WebApplicationContext wac;
+
+ private WebClient webClient;
+
+ @Before
+ public void setup() {
+ webClient = MockMvcWebClientBuilder
+ .webAppContextSetup(wac).build();
+ }
+
+ @Test
+ public void givenAMessage_whenSent_thenItShows() throws Exception {
+ String text = "Hello world!";
+ HtmlPage page;
+
+ String url = "http://localhost/message/showForm";
+ page = webClient.getPage(url);
+
+ HtmlTextInput messageText = page.getHtmlElementById("message");
+ messageText.setValueAttribute(text);
+
+ HtmlForm form = page.getForms().get(0);
+ HtmlSubmitInput submit = form.getOneHtmlElementByAttribute(
+ "input", "type", "submit");
+ HtmlPage newPage = submit.click();
+
+ String receivedText = newPage.getHtmlElementById("received")
+ .getTextContent();
+
+ Assert.assertEquals(receivedText, text);
+ }
+}
diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitTest.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitTest.java
deleted file mode 100644
index 6a7e961eb1..0000000000
--- a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitTest.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.baeldung.htmlunit;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import com.gargoylesoftware.htmlunit.WebClient;
-import com.gargoylesoftware.htmlunit.html.HtmlPage;
-
-public class HtmlUnitTest {
-
- @Test
- public void givenAClient_whenEnteringBaeldung_thenPageTitleIsCorrect() throws Exception {
- try (final WebClient webClient = new WebClient()) {
- webClient.getOptions().setThrowExceptionOnScriptError(false);
-
- final HtmlPage page = webClient.getPage("http://www.baeldung.com/");
- Assert.assertEquals("Baeldung | Java, Spring and Web Development tutorials", page.getTitleText());
- }
- }
-
-}
diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScraping.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScraping.java
index 9919d7571d..f97bedddef 100644
--- a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScraping.java
+++ b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScraping.java
@@ -5,36 +5,38 @@ import java.util.List;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlHeading1;
-import com.gargoylesoftware.htmlunit.html.HtmlHeading2;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class HtmlUnitWebScraping {
- public static void main(final String[] args) throws Exception {
- try (final WebClient webClient = new WebClient()) {
+ private WebClient webClient;
- webClient.getOptions().setCssEnabled(false);
- webClient.getOptions().setJavaScriptEnabled(false);
+ @Before
+ public void init() throws Exception {
+ webClient = new WebClient();
+ }
- final HtmlPage page = webClient.getPage("http://www.baeldung.com/full_archive");
- final HtmlAnchor latestPostLink = (HtmlAnchor) page.getByXPath("(//ul[@class='car-monthlisting']/li)[1]/a").get(0);
+ @After
+ public void close() throws Exception {
+ webClient.close();
+ }
- System.out.println("Entering: " + latestPostLink.getHrefAttribute());
+ @Test
+ public void givenBaeldungArchive_whenRetrievingArticle_thenHasH1()
+ throws Exception {
+ webClient.getOptions().setCssEnabled(false);
+ webClient.getOptions().setJavaScriptEnabled(false);
- final HtmlPage postPage = latestPostLink.click();
+ String url = "http://www.baeldung.com/full_archive";
+ HtmlPage page = webClient.getPage(url);
+ String xpath = "(//ul[@class='car-monthlisting']/li)[1]/a";
+ HtmlAnchor latestPostLink
+ = (HtmlAnchor) page.getByXPath(xpath).get(0);
+ HtmlPage postPage = latestPostLink.click();
- final HtmlHeading1 heading1 = (HtmlHeading1) postPage.getByXPath("//h1").get(0);
- System.out.println("Title: " + heading1.getTextContent());
-
- final List headings2 = (List) postPage.getByXPath("//h2");
-
- final StringBuilder sb = new StringBuilder(heading1.getTextContent());
- for (final HtmlHeading2 h2 : headings2) {
- sb.append("\n").append(h2.getTextContent());
- }
-
- System.out.println(sb.toString());
- }
- }
+ List h1
+ = (List) postPage.getByXPath("//h1");
+ Assert.assertTrue(h1.size() > 0);
+ }
}
diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md
index 783bbb2ef4..e96a8d0392 100644
--- a/spring-mvc-xml/README.md
+++ b/spring-mvc-xml/README.md
@@ -12,3 +12,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Servlet Session Timeout](http://www.baeldung.com/servlet-session-timeout)
- [Basic Forms with Spring MVC](http://www.baeldung.com/spring-mvc-form-tutorial)
- [Returning Image/Media Data with Spring MVC](http://www.baeldung.com/spring-mvc-image-media-data)
+- [Geolocation by IP in Java](http://www.baeldung.com/geolocation-by-ip-with-maxmind)
diff --git a/spring-quartz/pom.xml b/spring-quartz/pom.xml
index 709cfb9e3d..2fb4ab0e47 100644
--- a/spring-quartz/pom.xml
+++ b/spring-quartz/pom.xml
@@ -13,13 +13,15 @@
org.springframework.boot
spring-boot-starter-parent
- 1.2.6.RELEASE
+ 1.4.2.RELEASE
UTF-8
1.8
+ 2.2.3
+ 3.6.0
@@ -39,7 +41,7 @@
org.quartz-scheduler
quartz
- 2.2.1
+ ${quartz.version}
@@ -64,7 +66,7 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.1
+ ${maven-compiler-plugin.version}
1.8
1.8
diff --git a/spring-quartz/src/main/java/org/baeldung/springquartz/SpringQuartzApp.java b/spring-quartz/src/main/java/org/baeldung/springquartz/SpringQuartzApp.java
index 547ef78d84..1cba49b414 100644
--- a/spring-quartz/src/main/java/org/baeldung/springquartz/SpringQuartzApp.java
+++ b/spring-quartz/src/main/java/org/baeldung/springquartz/SpringQuartzApp.java
@@ -1,6 +1,6 @@
package org.baeldung.springquartz;
-import org.springframework.boot.SpringApplication;
+import org.springframework.boot.Banner.Mode;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;
@@ -10,6 +10,6 @@ import org.springframework.scheduling.annotation.EnableScheduling;
public class SpringQuartzApp {
public static void main(String[] args) {
- new SpringApplicationBuilder(SpringQuartzApp.class).showBanner(false).run(args);
+ new SpringApplicationBuilder(SpringQuartzApp.class).bannerMode(Mode.OFF).run(args);
}
}
diff --git a/spring-rest-angular/pom.xml b/spring-rest-angular/pom.xml
index ce496df742..e838e2d5e6 100644
--- a/spring-rest-angular/pom.xml
+++ b/spring-rest-angular/pom.xml
@@ -11,7 +11,7 @@
org.springframework.boot
spring-boot-starter-parent
- 1.3.3.RELEASE
+ 1.4.2.RELEASE
@@ -45,7 +45,7 @@
org.apache.commons
commons-lang3
- 3.3
+ ${commons-lang3.version}
com.google.guava
@@ -60,15 +60,20 @@
io.rest-assured
rest-assured
- 3.0.0
+ ${rest-assured.version}
test
io.rest-assured
spring-mock-mvc
- 3.0.0
+ ${rest-assured.version}
test
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
@@ -142,6 +147,8 @@
19.0
+ 3.5
+ 3.0.1
diff --git a/spring-rest-angular/src/test/java/org/baeldung/web/service/StudentServiceIntegrationTest.java b/spring-rest-angular/src/test/java/org/baeldung/web/service/StudentServiceIntegrationTest.java
index 6ad80e5caf..48c985fb9d 100644
--- a/spring-rest-angular/src/test/java/org/baeldung/web/service/StudentServiceIntegrationTest.java
+++ b/spring-rest-angular/src/test/java/org/baeldung/web/service/StudentServiceIntegrationTest.java
@@ -1,26 +1,23 @@
package org.baeldung.web.service;
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsCollectionContaining.hasItems;
+import static org.hamcrest.core.IsEqual.equalTo;
+
import org.apache.commons.lang3.RandomStringUtils;
import org.baeldung.web.main.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.springframework.boot.test.IntegrationTest;
-import org.springframework.boot.test.SpringApplicationConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.test.context.junit4.SpringRunner;
-import static io.restassured.RestAssured.*;
-import static org.hamcrest.core.IsCollectionContaining.*;
-import static org.hamcrest.core.Is.*;
-import static org.hamcrest.core.IsEqual.*;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@SpringApplicationConfiguration(classes = Application.class)
-@WebAppConfiguration
-@IntegrationTest("server.port:8888")
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)
public class StudentServiceIntegrationTest {
- private static final String ENDPOINT = "http://localhost:8888/student/get";
+ private static final String ENDPOINT = "http://localhost:8080/student/get";
@Test
public void givenRequestForStudents_whenPageIsOne_expectContainsNames() {
diff --git a/spring-rest-docs/pom.xml b/spring-rest-docs/pom.xml
index 8e758eeb4a..2e8a70e96b 100644
--- a/spring-rest-docs/pom.xml
+++ b/spring-rest-docs/pom.xml
@@ -14,7 +14,7 @@
org.springframework.boot
spring-boot-starter-parent
- 1.3.3.RELEASE
+ 1.4.2.RELEASE
@@ -22,6 +22,9 @@
UTF-8
1.8
${project.build.directory}/generated-snippets
+ 1.1.2.RELEASE
+ 2.2.0
+ 1.5.3
@@ -42,23 +45,23 @@
org.springframework.restdocs
spring-restdocs-mockmvc
- 1.0.1.RELEASE
+ ${restdocs.version}
test
- com.jayway.jsonpath
- json-path
- 2.0.0
-
+ com.jayway.jsonpath
+ json-path
+ ${jsonpath.version}
+
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
org.apache.maven.plugins
maven-surefire-plugin
@@ -70,7 +73,7 @@
org.asciidoctor
asciidoctor-maven-plugin
- 1.5.2
+ ${asciidoctor-plugin.version}
generate-docs
diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/MyFooController.java b/spring-rest/src/main/java/org/baeldung/web/controller/MyFooController.java
new file mode 100644
index 0000000000..f19ddca435
--- /dev/null
+++ b/spring-rest/src/main/java/org/baeldung/web/controller/MyFooController.java
@@ -0,0 +1,76 @@
+package org.baeldung.web.controller;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.baeldung.web.dto.Foo;
+import org.baeldung.web.exception.ResourceNotFoundException;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+@Controller
+@RequestMapping(value = "/myfoos")
+public class MyFooController {
+
+ private final Map myfoos;
+
+ public MyFooController() {
+ super();
+ myfoos = new HashMap();
+ myfoos.put(1L, new Foo(1L, "sample foo"));
+ }
+
+ // API - read
+
+ @RequestMapping(method = RequestMethod.GET)
+ @ResponseBody
+ public Collection findAll() {
+ return myfoos.values();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, value = "/{id}", produces = { "application/json" })
+ @ResponseBody
+ public Foo findById(@PathVariable final long id) {
+ final Foo foo = myfoos.get(id);
+ if (foo == null) {
+ throw new ResourceNotFoundException();
+ }
+ return foo;
+ }
+
+ // API - write
+
+ @RequestMapping(method = RequestMethod.PUT, value = "/{id}")
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public Foo updateFoo(@PathVariable("id") final long id, @RequestBody final Foo foo) {
+ myfoos.put(id, foo);
+ return foo;
+ }
+
+ @RequestMapping(method = RequestMethod.POST)
+ @ResponseStatus(HttpStatus.CREATED)
+ @ResponseBody
+ public Foo createFoo(@RequestBody final Foo foo, HttpServletResponse response) {
+ myfoos.put(foo.getId(), foo);
+ response.setHeader("Location", ServletUriComponentsBuilder.fromCurrentRequest().path("/" + foo.getId()).toUriString());
+ return foo;
+ }
+
+ @RequestMapping(method = RequestMethod.DELETE, value = "/{id}")
+ @ResponseStatus(HttpStatus.OK)
+ public void deleteById(@PathVariable final long id) {
+ myfoos.remove(id);
+ }
+
+}
diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/Foo.java b/spring-rest/src/main/java/org/baeldung/web/dto/Foo.java
index 774d547464..240b368b50 100644
--- a/spring-rest/src/main/java/org/baeldung/web/dto/Foo.java
+++ b/spring-rest/src/main/java/org/baeldung/web/dto/Foo.java
@@ -11,6 +11,12 @@ public class Foo {
super();
}
+ public Foo(final String name) {
+ super();
+
+ this.name = name;
+ }
+
public Foo(final long id, final String name) {
super();
diff --git a/spring-rest/src/main/java/org/baeldung/web/exception/ResourceNotFoundException.java b/spring-rest/src/main/java/org/baeldung/web/exception/ResourceNotFoundException.java
new file mode 100644
index 0000000000..aab737b6ec
--- /dev/null
+++ b/spring-rest/src/main/java/org/baeldung/web/exception/ResourceNotFoundException.java
@@ -0,0 +1,8 @@
+package org.baeldung.web.exception;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(value = HttpStatus.NOT_FOUND)
+public class ResourceNotFoundException extends RuntimeException {
+}
diff --git a/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml b/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml
index 21136b62c6..0f80990c16 100644
--- a/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml
+++ b/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml
@@ -8,7 +8,7 @@
-
+
+
@@ -43,6 +44,11 @@
+
+
+
+
diff --git a/spring-rest/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java b/spring-rest/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java
index e4321e163f..a47c60e9d8 100644
--- a/spring-rest/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java
+++ b/spring-rest/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java
@@ -1,28 +1,42 @@
package org.baeldung.client;
+import static org.apache.commons.codec.binary.Base64.encodeBase64;
import static org.baeldung.client.Consts.APPLICATION_PORT;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.Matchers.notNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import java.io.IOException;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Set;
import org.baeldung.web.dto.Foo;
import org.junit.Before;
import org.junit.Test;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.RequestCallback;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.Charsets;
public class RestTemplateBasicLiveTest {
private RestTemplate restTemplate;
- private static final String fooResourceUrl = "http://localhost:" + APPLICATION_PORT + "/spring-rest/foos";
+ private static final String fooResourceUrl = "http://localhost:" + APPLICATION_PORT + "/spring-rest/myfoos";
@Before
public void beforeTest() {
@@ -33,19 +47,19 @@ public class RestTemplateBasicLiveTest {
@Test
public void givenResourceUrl_whenSendGetForRequestEntity_thenStatusOk() throws IOException {
- ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);
+ final ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
}
@Test
public void givenResourceUrl_whenSendGetForRequestEntity_thenBodyCorrect() throws IOException {
- ResponseEntity