Skip to content

Commit d4e54e5

Browse files
committed
polymorphism with jackson
1 parent e3b5a5a commit d4e54e5

8 files changed

Lines changed: 195 additions & 0 deletions

File tree

jackson-inheritance/pom.xml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>com.fd</groupId>
8+
<artifactId>jackson-inheritance</artifactId>
9+
<version>1.0-SNAPSHOT</version>
10+
11+
<properties>
12+
<java-version>1.8</java-version>
13+
<maven.compiler.source>1.8</maven.compiler.source>
14+
<maven.compiler.target>1.8</maven.compiler.target>
15+
</properties>
16+
17+
<dependencies>
18+
<dependency>
19+
<groupId>org.projectlombok</groupId>
20+
<artifactId>lombok</artifactId>
21+
<version>1.18.4</version>
22+
</dependency>
23+
24+
<dependency>
25+
<groupId>junit</groupId>
26+
<artifactId>junit</artifactId>
27+
<version>4.12</version>
28+
</dependency>
29+
30+
<dependency>
31+
<groupId>org.codehaus.jackson</groupId>
32+
<artifactId>jackson-core-asl</artifactId>
33+
<version>1.9.13</version>
34+
</dependency>
35+
36+
<dependency>
37+
<groupId>com.fasterxml.jackson.core</groupId>
38+
<artifactId>jackson-databind</artifactId>
39+
<version>2.9.7</version>
40+
<scope>test</scope>
41+
</dependency>
42+
<dependency>
43+
<groupId>com.fasterxml.jackson.core</groupId>
44+
<artifactId>jackson-annotations</artifactId>
45+
<version>2.9.5</version>
46+
<scope>compile</scope>
47+
</dependency>
48+
49+
</dependencies>
50+
51+
</project>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.fd.jackson.inheritance;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
6+
/**
7+
* @author fdanismaz
8+
* date: 3/11/19 8:30 PM
9+
*/
10+
@Getter
11+
@Setter
12+
public class Resource<T> {
13+
14+
private T content;
15+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.fd.jackson.inheritance;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
6+
/**
7+
* @author fdanismaz
8+
* date: 3/11/19 8:29 PM
9+
*/
10+
@Getter
11+
@Setter
12+
public class RestApiResponseBody<T> {
13+
14+
private T body;
15+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.fd.jackson.inheritance;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
6+
/**
7+
* @author fdanismaz
8+
* date: 3/11/19 8:18 PM
9+
*/
10+
@Getter
11+
@Setter
12+
public class Ticket {
13+
private String title;
14+
private TicketReferences references;
15+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.fd.jackson.inheritance;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
6+
/**
7+
* @author fdanismaz
8+
* date: 3/11/19 8:15 PM
9+
*/
10+
@Getter
11+
@Setter
12+
public class TicketIncidentReference implements TicketReference {
13+
14+
private String incidentId;
15+
private String incidentName;
16+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.fd.jackson.inheritance;
2+
3+
import com.fasterxml.jackson.annotation.JsonSubTypes;
4+
import com.fasterxml.jackson.annotation.JsonTypeInfo;
5+
6+
/**
7+
* @author fdanismaz
8+
* date: 3/11/19 8:15 PM
9+
*/
10+
@JsonTypeInfo(
11+
use = JsonTypeInfo.Id.NAME,
12+
property = "type")
13+
@JsonSubTypes({
14+
@JsonSubTypes.Type(value = TicketIncidentReference.class, name = "incident")
15+
})
16+
public interface TicketReference {
17+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.fd.jackson.inheritance;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
6+
import java.util.List;
7+
8+
/**
9+
* @author fdanismaz
10+
* date: 3/11/19 8:16 PM
11+
*/
12+
@Getter
13+
@Setter
14+
public class TicketReferences {
15+
private List<TicketReference> references;
16+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import com.fasterxml.jackson.core.type.TypeReference;
2+
import com.fasterxml.jackson.databind.ObjectMapper;
3+
import com.fd.jackson.inheritance.*;
4+
import org.junit.Test;
5+
6+
import java.io.IOException;
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
import static org.junit.Assert.assertEquals;
11+
12+
/**
13+
* @author fdanismaz
14+
* date: 3/11/19 8:05 PM
15+
*/
16+
public class JacksonInheritanceTest {
17+
18+
@Test
19+
public void testTicketReferenceSerialization() throws IOException {
20+
TicketReferences references = new TicketReferences();
21+
List<TicketReference> referenceList = new ArrayList<>();
22+
TicketIncidentReference incidentReference = new TicketIncidentReference();
23+
incidentReference.setIncidentId("1");
24+
incidentReference.setIncidentName("incident-1");
25+
referenceList.add(incidentReference);
26+
references.setReferences(referenceList);
27+
28+
Ticket ticket = new Ticket();
29+
ticket.setReferences(references);
30+
ticket.setTitle("Ticket-1");
31+
32+
Resource<Ticket> r = new Resource<>();
33+
r.setContent(ticket);
34+
35+
RestApiResponseBody<Resource<Ticket>> rarb = new RestApiResponseBody<>();
36+
rarb.setBody(r);
37+
38+
ObjectMapper mapper = new ObjectMapper();
39+
String jsonDataString = mapper.writeValueAsString(rarb);
40+
41+
System.out.println(jsonDataString);
42+
43+
RestApiResponseBody<Resource<Ticket>> parsedResponse = mapper.readValue(jsonDataString, new TypeReference<RestApiResponseBody<Resource<Ticket>>>() {});
44+
Ticket parsedTicket = parsedResponse.getBody().getContent();
45+
46+
assertEquals("Ticket-1", parsedTicket.getTitle());
47+
assertEquals(1, parsedTicket.getReferences().getReferences().size());
48+
assertEquals("incident-1", ((TicketIncidentReference)(parsedTicket.getReferences().getReferences().get(0))).getIncidentName());
49+
}
50+
}

0 commit comments

Comments
 (0)