Skip to content

Commit 19a558b

Browse files
committed
Add Jackson JSON View Test
1 parent 01fc47a commit 19a558b

File tree

10 files changed

+277
-0
lines changed

10 files changed

+277
-0
lines changed

jackson/pom.xml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,33 @@
99

1010
<dependencies>
1111

12+
<!-- Spring -->
13+
<dependency>
14+
<groupId>org.springframework</groupId>
15+
<artifactId>spring-web</artifactId>
16+
<version>${org.springframework.version}</version>
17+
<exclusions>
18+
<exclusion>
19+
<artifactId>commons-logging</artifactId>
20+
<groupId>commons-logging</groupId>
21+
</exclusion>
22+
</exclusions>
23+
</dependency>
24+
<dependency>
25+
<groupId>org.springframework</groupId>
26+
<artifactId>spring-webmvc</artifactId>
27+
<version>${org.springframework.version}</version>
28+
</dependency>
29+
<dependency>
30+
<groupId>org.springframework</groupId>
31+
<artifactId>spring-oxm</artifactId>
32+
<version>${org.springframework.version}</version>
33+
</dependency>
34+
<dependency>
35+
<groupId>org.springframework.boot</groupId>
36+
<artifactId>spring-boot-starter-web</artifactId>
37+
<version>1.1.9.RELEASE</version>
38+
</dependency>
1239
<!-- utils -->
1340

1441
<dependency>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.baeldung.jackson.jsonview;
2+
3+
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
4+
import org.springframework.boot.SpringApplication;
5+
import org.springframework.context.annotation.ComponentScan;
6+
7+
@ComponentScan
8+
@EnableAutoConfiguration
9+
public class Application {
10+
11+
public static void main(String[] args) {
12+
SpringApplication.run(Application.class, args);
13+
}
14+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.baeldung.jackson.jsonview;
2+
3+
import com.fasterxml.jackson.annotation.JsonView;
4+
5+
public class Item {
6+
@JsonView(Views.Public.class)
7+
public int id;
8+
9+
@JsonView(Views.Public.class)
10+
public String itemName;
11+
12+
@JsonView(Views.Internal.class)
13+
public User owner;
14+
15+
public Item() {
16+
super();
17+
}
18+
19+
public Item(final int id, final String itemName, final User owner) {
20+
this.id = id;
21+
this.itemName = itemName;
22+
this.owner = owner;
23+
}
24+
25+
public int getId() {
26+
return id;
27+
}
28+
29+
public String getItemName() {
30+
return itemName;
31+
}
32+
33+
public User getOwner() {
34+
return owner;
35+
}
36+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.baeldung.jackson.jsonview;
2+
3+
public class ItemManager {
4+
5+
public static Item getById(final int id) {
6+
final User owner = new User(1, "John");
7+
final Item item = new Item(2, "book", owner);
8+
return item;
9+
}
10+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.baeldung.jackson.jsonview;
2+
3+
import java.util.List;
4+
5+
import com.fasterxml.jackson.databind.BeanDescription;
6+
import com.fasterxml.jackson.databind.SerializationConfig;
7+
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
8+
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
9+
10+
public class MyBeanSerializerModifier extends BeanSerializerModifier {
11+
12+
@Override
13+
public List<BeanPropertyWriter> changeProperties(final SerializationConfig config, final BeanDescription beanDesc, final List<BeanPropertyWriter> beanProperties) {
14+
for (int i = 0; i < beanProperties.size(); i++) {
15+
final BeanPropertyWriter beanPropertyWriter = beanProperties.get(i);
16+
if (beanPropertyWriter.getName() == "name") {
17+
beanProperties.set(i, new UpperCasingWriter(beanPropertyWriter));
18+
}
19+
}
20+
return beanProperties;
21+
}
22+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.baeldung.jackson.jsonview;
2+
3+
import com.fasterxml.jackson.core.JsonGenerator;
4+
import com.fasterxml.jackson.databind.SerializerProvider;
5+
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
6+
7+
public class UpperCasingWriter extends BeanPropertyWriter {
8+
final BeanPropertyWriter _writer;
9+
10+
public UpperCasingWriter(final BeanPropertyWriter w) {
11+
super(w);
12+
_writer = w;
13+
}
14+
15+
@Override
16+
public void serializeAsField(final Object bean, final JsonGenerator gen, final SerializerProvider prov) throws Exception {
17+
String value = ((User) bean).name;
18+
value = (value == null) ? "" : value.toUpperCase();
19+
gen.writeStringField("name", value);
20+
}
21+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.baeldung.jackson.jsonview;
2+
3+
import com.fasterxml.jackson.annotation.JsonView;
4+
5+
public class User {
6+
@JsonView(Views.Public.class)
7+
public int id;
8+
9+
@JsonView(Views.Public.class)
10+
public String name;
11+
12+
public User() {
13+
super();
14+
}
15+
16+
public User(final int id, final String name) {
17+
this.id = id;
18+
this.name = name;
19+
}
20+
21+
public int getId() {
22+
return id;
23+
}
24+
25+
public String getName() {
26+
return name;
27+
}
28+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.baeldung.jackson.jsonview;
2+
3+
import org.springframework.web.bind.annotation.PathVariable;
4+
import org.springframework.web.bind.annotation.RequestMapping;
5+
import org.springframework.web.bind.annotation.RestController;
6+
7+
import com.fasterxml.jackson.annotation.JsonView;
8+
9+
@RestController
10+
public class UserController {
11+
12+
@JsonView(Views.Public.class)
13+
@RequestMapping("/{id}")
14+
public Item getItemPublic(@PathVariable final int id) {
15+
return ItemManager.getById(id);
16+
}
17+
18+
@JsonView(Views.Internal.class)
19+
@RequestMapping("/internal/{id}")
20+
public Item getItemInternal(@PathVariable final int id) {
21+
return ItemManager.getById(id);
22+
}
23+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.baeldung.jackson.jsonview;
2+
3+
public class Views {
4+
public static class Public {
5+
}
6+
7+
public static class Internal extends Public {
8+
}
9+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package org.baeldung.jackson.test;
2+
3+
import static org.hamcrest.Matchers.containsString;
4+
import static org.hamcrest.Matchers.not;
5+
import static org.junit.Assert.assertEquals;
6+
import static org.junit.Assert.assertThat;
7+
8+
import java.io.IOException;
9+
10+
import org.baeldung.jackson.jsonview.Item;
11+
import org.baeldung.jackson.jsonview.MyBeanSerializerModifier;
12+
import org.baeldung.jackson.jsonview.User;
13+
import org.baeldung.jackson.jsonview.Views;
14+
import org.junit.Test;
15+
16+
import com.fasterxml.jackson.core.JsonProcessingException;
17+
import com.fasterxml.jackson.databind.ObjectMapper;
18+
import com.fasterxml.jackson.databind.ser.BeanSerializerFactory;
19+
import com.fasterxml.jackson.databind.ser.SerializerFactory;
20+
21+
public class JacksonJsonViewTest {
22+
23+
@Test
24+
public void whenUseJsonViewToSerialize_thenCorrect() throws JsonProcessingException {
25+
final User user = new User(1, "John");
26+
27+
final ObjectMapper mapper = new ObjectMapper();
28+
final String result = mapper.writerWithView(Views.Public.class).writeValueAsString(user);
29+
30+
assertThat(result, containsString("John"));
31+
assertThat(result, containsString("1"));
32+
}
33+
34+
@Test
35+
public void whenUsePublicView_thenOnlyPublicSerialized() throws JsonProcessingException {
36+
final User owner = new User(1, "John");
37+
final Item item = new Item(2, "book", owner);
38+
39+
final ObjectMapper mapper = new ObjectMapper();
40+
final String result = mapper.writerWithView(Views.Public.class).writeValueAsString(item);
41+
42+
assertThat(result, containsString("book"));
43+
assertThat(result, containsString("2"));
44+
45+
assertThat(result, not(containsString("John")));
46+
assertThat(result, not(containsString("1")));
47+
}
48+
49+
@Test
50+
public void whenUseInternalView_thenAllSerialized() throws JsonProcessingException {
51+
final User owner = new User(1, "John");
52+
final Item item = new Item(2, "book", owner);
53+
54+
final ObjectMapper mapper = new ObjectMapper();
55+
final String result = mapper.writerWithView(Views.Internal.class).writeValueAsString(item);
56+
57+
assertThat(result, containsString("book"));
58+
assertThat(result, containsString("2"));
59+
60+
assertThat(result, containsString("John"));
61+
assertThat(result, containsString("1"));
62+
}
63+
64+
@Test
65+
public void whenUseJsonViewToDeserialize_thenCorrect() throws IOException {
66+
final String json = "{\"id\":1,\"name\":\"John\"}";
67+
68+
final ObjectMapper mapper = new ObjectMapper();
69+
70+
final User user = mapper.readerWithView(Views.Public.class).withType(User.class).readValue(json);
71+
assertEquals(1, user.getId());
72+
assertEquals("John", user.getName());
73+
}
74+
75+
@Test
76+
public void whenUseCustomJsonViewToSerialize_thenCorrect() throws JsonProcessingException {
77+
final User user = new User(1, "John");
78+
final SerializerFactory serializerFactory = BeanSerializerFactory.instance.withSerializerModifier(new MyBeanSerializerModifier());
79+
80+
final ObjectMapper mapper = new ObjectMapper();
81+
mapper.setSerializerFactory(serializerFactory);
82+
83+
final String result = mapper.writerWithView(Views.Public.class).writeValueAsString(user);
84+
assertThat(result, containsString("JOHN"));
85+
assertThat(result, containsString("1"));
86+
}
87+
}

0 commit comments

Comments
 (0)