From 19a558bfec10492c88db59fa986b32ee938c8738 Mon Sep 17 00:00:00 2001
From: DOHA <dohae243@gmail.com>
Date: Thu, 11 Dec 2014 21:29:11 +0200
Subject: [PATCH] Add Jackson JSON View Test

---
 jackson/pom.xml                               | 27 ++++++
 .../jackson/jsonview/Application.java         | 14 +++
 .../org/baeldung/jackson/jsonview/Item.java   | 36 ++++++++
 .../jackson/jsonview/ItemManager.java         | 10 +++
 .../jsonview/MyBeanSerializerModifier.java    | 22 +++++
 .../jackson/jsonview/UpperCasingWriter.java   | 21 +++++
 .../org/baeldung/jackson/jsonview/User.java   | 28 ++++++
 .../jackson/jsonview/UserController.java      | 23 +++++
 .../org/baeldung/jackson/jsonview/Views.java  |  9 ++
 .../jackson/test/JacksonJsonViewTest.java     | 87 +++++++++++++++++++
 10 files changed, 277 insertions(+)
 create mode 100644 jackson/src/test/java/org/baeldung/jackson/jsonview/Application.java
 create mode 100644 jackson/src/test/java/org/baeldung/jackson/jsonview/Item.java
 create mode 100644 jackson/src/test/java/org/baeldung/jackson/jsonview/ItemManager.java
 create mode 100644 jackson/src/test/java/org/baeldung/jackson/jsonview/MyBeanSerializerModifier.java
 create mode 100644 jackson/src/test/java/org/baeldung/jackson/jsonview/UpperCasingWriter.java
 create mode 100644 jackson/src/test/java/org/baeldung/jackson/jsonview/User.java
 create mode 100644 jackson/src/test/java/org/baeldung/jackson/jsonview/UserController.java
 create mode 100644 jackson/src/test/java/org/baeldung/jackson/jsonview/Views.java
 create mode 100644 jackson/src/test/java/org/baeldung/jackson/test/JacksonJsonViewTest.java

diff --git a/jackson/pom.xml b/jackson/pom.xml
index 654be183f1..501310d622 100644
--- a/jackson/pom.xml
+++ b/jackson/pom.xml
@@ -9,6 +9,33 @@
 
 	<dependencies>
 
+		<!-- Spring -->
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-web</artifactId>
+			<version>${org.springframework.version}</version>
+			<exclusions>
+				<exclusion>
+					<artifactId>commons-logging</artifactId>
+					<groupId>commons-logging</groupId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-webmvc</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-oxm</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <version>1.1.9.RELEASE</version>
+        </dependency>
 		<!-- utils -->
 
 		<dependency>
diff --git a/jackson/src/test/java/org/baeldung/jackson/jsonview/Application.java b/jackson/src/test/java/org/baeldung/jackson/jsonview/Application.java
new file mode 100644
index 0000000000..eea9745d38
--- /dev/null
+++ b/jackson/src/test/java/org/baeldung/jackson/jsonview/Application.java
@@ -0,0 +1,14 @@
+package org.baeldung.jackson.jsonview;
+
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.SpringApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@ComponentScan
+@EnableAutoConfiguration
+public class Application {
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+}
diff --git a/jackson/src/test/java/org/baeldung/jackson/jsonview/Item.java b/jackson/src/test/java/org/baeldung/jackson/jsonview/Item.java
new file mode 100644
index 0000000000..758a1338ec
--- /dev/null
+++ b/jackson/src/test/java/org/baeldung/jackson/jsonview/Item.java
@@ -0,0 +1,36 @@
+package org.baeldung.jackson.jsonview;
+
+import com.fasterxml.jackson.annotation.JsonView;
+
+public class Item {
+    @JsonView(Views.Public.class)
+    public int id;
+
+    @JsonView(Views.Public.class)
+    public String itemName;
+
+    @JsonView(Views.Internal.class)
+    public User owner;
+
+    public Item() {
+        super();
+    }
+
+    public Item(final int id, final String itemName, final User owner) {
+        this.id = id;
+        this.itemName = itemName;
+        this.owner = owner;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public String getItemName() {
+        return itemName;
+    }
+
+    public User getOwner() {
+        return owner;
+    }
+}
diff --git a/jackson/src/test/java/org/baeldung/jackson/jsonview/ItemManager.java b/jackson/src/test/java/org/baeldung/jackson/jsonview/ItemManager.java
new file mode 100644
index 0000000000..0554a8dba3
--- /dev/null
+++ b/jackson/src/test/java/org/baeldung/jackson/jsonview/ItemManager.java
@@ -0,0 +1,10 @@
+package org.baeldung.jackson.jsonview;
+
+public class ItemManager {
+
+    public static Item getById(final int id) {
+        final User owner = new User(1, "John");
+        final Item item = new Item(2, "book", owner);
+        return item;
+    }
+}
diff --git a/jackson/src/test/java/org/baeldung/jackson/jsonview/MyBeanSerializerModifier.java b/jackson/src/test/java/org/baeldung/jackson/jsonview/MyBeanSerializerModifier.java
new file mode 100644
index 0000000000..0986e5ea76
--- /dev/null
+++ b/jackson/src/test/java/org/baeldung/jackson/jsonview/MyBeanSerializerModifier.java
@@ -0,0 +1,22 @@
+package org.baeldung.jackson.jsonview;
+
+import java.util.List;
+
+import com.fasterxml.jackson.databind.BeanDescription;
+import com.fasterxml.jackson.databind.SerializationConfig;
+import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
+import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
+
+public class MyBeanSerializerModifier extends BeanSerializerModifier {
+
+    @Override
+    public List<BeanPropertyWriter> changeProperties(final SerializationConfig config, final BeanDescription beanDesc, final List<BeanPropertyWriter> beanProperties) {
+        for (int i = 0; i < beanProperties.size(); i++) {
+            final BeanPropertyWriter beanPropertyWriter = beanProperties.get(i);
+            if (beanPropertyWriter.getName() == "name") {
+                beanProperties.set(i, new UpperCasingWriter(beanPropertyWriter));
+            }
+        }
+        return beanProperties;
+    }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/org/baeldung/jackson/jsonview/UpperCasingWriter.java b/jackson/src/test/java/org/baeldung/jackson/jsonview/UpperCasingWriter.java
new file mode 100644
index 0000000000..948fb36cda
--- /dev/null
+++ b/jackson/src/test/java/org/baeldung/jackson/jsonview/UpperCasingWriter.java
@@ -0,0 +1,21 @@
+package org.baeldung.jackson.jsonview;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
+
+public class UpperCasingWriter extends BeanPropertyWriter {
+    final BeanPropertyWriter _writer;
+
+    public UpperCasingWriter(final BeanPropertyWriter w) {
+        super(w);
+        _writer = w;
+    }
+
+    @Override
+    public void serializeAsField(final Object bean, final JsonGenerator gen, final SerializerProvider prov) throws Exception {
+        String value = ((User) bean).name;
+        value = (value == null) ? "" : value.toUpperCase();
+        gen.writeStringField("name", value);
+    }
+}
diff --git a/jackson/src/test/java/org/baeldung/jackson/jsonview/User.java b/jackson/src/test/java/org/baeldung/jackson/jsonview/User.java
new file mode 100644
index 0000000000..ed51881cf0
--- /dev/null
+++ b/jackson/src/test/java/org/baeldung/jackson/jsonview/User.java
@@ -0,0 +1,28 @@
+package org.baeldung.jackson.jsonview;
+
+import com.fasterxml.jackson.annotation.JsonView;
+
+public class User {
+    @JsonView(Views.Public.class)
+    public int id;
+
+    @JsonView(Views.Public.class)
+    public String name;
+
+    public User() {
+        super();
+    }
+
+    public User(final int id, final String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public String getName() {
+        return name;
+    }
+}
diff --git a/jackson/src/test/java/org/baeldung/jackson/jsonview/UserController.java b/jackson/src/test/java/org/baeldung/jackson/jsonview/UserController.java
new file mode 100644
index 0000000000..ac487badb1
--- /dev/null
+++ b/jackson/src/test/java/org/baeldung/jackson/jsonview/UserController.java
@@ -0,0 +1,23 @@
+package org.baeldung.jackson.jsonview;
+
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.fasterxml.jackson.annotation.JsonView;
+
+@RestController
+public class UserController {
+
+    @JsonView(Views.Public.class)
+    @RequestMapping("/{id}")
+    public Item getItemPublic(@PathVariable final int id) {
+        return ItemManager.getById(id);
+    }
+
+    @JsonView(Views.Internal.class)
+    @RequestMapping("/internal/{id}")
+    public Item getItemInternal(@PathVariable final int id) {
+        return ItemManager.getById(id);
+    }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/org/baeldung/jackson/jsonview/Views.java b/jackson/src/test/java/org/baeldung/jackson/jsonview/Views.java
new file mode 100644
index 0000000000..0a430ad123
--- /dev/null
+++ b/jackson/src/test/java/org/baeldung/jackson/jsonview/Views.java
@@ -0,0 +1,9 @@
+package org.baeldung.jackson.jsonview;
+
+public class Views {
+    public static class Public {
+    }
+
+    public static class Internal extends Public {
+    }
+}
diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonJsonViewTest.java b/jackson/src/test/java/org/baeldung/jackson/test/JacksonJsonViewTest.java
new file mode 100644
index 0000000000..0f0e4272e5
--- /dev/null
+++ b/jackson/src/test/java/org/baeldung/jackson/test/JacksonJsonViewTest.java
@@ -0,0 +1,87 @@
+package org.baeldung.jackson.test;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import java.io.IOException;
+
+import org.baeldung.jackson.jsonview.Item;
+import org.baeldung.jackson.jsonview.MyBeanSerializerModifier;
+import org.baeldung.jackson.jsonview.User;
+import org.baeldung.jackson.jsonview.Views;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ser.BeanSerializerFactory;
+import com.fasterxml.jackson.databind.ser.SerializerFactory;
+
+public class JacksonJsonViewTest {
+
+    @Test
+    public void whenUseJsonViewToSerialize_thenCorrect() throws JsonProcessingException {
+        final User user = new User(1, "John");
+
+        final ObjectMapper mapper = new ObjectMapper();
+        final String result = mapper.writerWithView(Views.Public.class).writeValueAsString(user);
+
+        assertThat(result, containsString("John"));
+        assertThat(result, containsString("1"));
+    }
+
+    @Test
+    public void whenUsePublicView_thenOnlyPublicSerialized() throws JsonProcessingException {
+        final User owner = new User(1, "John");
+        final Item item = new Item(2, "book", owner);
+
+        final ObjectMapper mapper = new ObjectMapper();
+        final String result = mapper.writerWithView(Views.Public.class).writeValueAsString(item);
+
+        assertThat(result, containsString("book"));
+        assertThat(result, containsString("2"));
+
+        assertThat(result, not(containsString("John")));
+        assertThat(result, not(containsString("1")));
+    }
+
+    @Test
+    public void whenUseInternalView_thenAllSerialized() throws JsonProcessingException {
+        final User owner = new User(1, "John");
+        final Item item = new Item(2, "book", owner);
+
+        final ObjectMapper mapper = new ObjectMapper();
+        final String result = mapper.writerWithView(Views.Internal.class).writeValueAsString(item);
+
+        assertThat(result, containsString("book"));
+        assertThat(result, containsString("2"));
+
+        assertThat(result, containsString("John"));
+        assertThat(result, containsString("1"));
+    }
+
+    @Test
+    public void whenUseJsonViewToDeserialize_thenCorrect() throws IOException {
+        final String json = "{\"id\":1,\"name\":\"John\"}";
+
+        final ObjectMapper mapper = new ObjectMapper();
+
+        final User user = mapper.readerWithView(Views.Public.class).withType(User.class).readValue(json);
+        assertEquals(1, user.getId());
+        assertEquals("John", user.getName());
+    }
+
+    @Test
+    public void whenUseCustomJsonViewToSerialize_thenCorrect() throws JsonProcessingException {
+        final User user = new User(1, "John");
+        final SerializerFactory serializerFactory = BeanSerializerFactory.instance.withSerializerModifier(new MyBeanSerializerModifier());
+
+        final ObjectMapper mapper = new ObjectMapper();
+        mapper.setSerializerFactory(serializerFactory);
+
+        final String result = mapper.writerWithView(Views.Public.class).writeValueAsString(user);
+        assertThat(result, containsString("JOHN"));
+        assertThat(result, containsString("1"));
+    }
+}
\ No newline at end of file