1 package com.fasterxml.jackson.databind.mixins;
2 
3 import java.io.IOException;
4 
5 import com.fasterxml.jackson.annotation.*;
6 
7 import com.fasterxml.jackson.databind.*;
8 
9 public class MapperMixinsCopy1998Test extends BaseMapTest
10 {
11     final static String FULLMODEL="{\"format\":\"1.0\",\"child\":{\"type\":\"CHILD_B\",\"name\":\"testB\"},\"notVisible\":\"should not be present\"}";
12     final static String EXPECTED="{\"format\":\"1.0\",\"child\":{\"name\":\"testB\"}}";
13 
14     static class MyModelView { }
15 
16     interface MixinConfig {
17         interface MyModelRoot {
18             @JsonView(MyModelView.class)
getFormat()19             public String getFormat();
20 
21             @JsonView(MyModelView.class)
getChild()22             public MyModelChildBase getChild();
23         }
24 
25         @JsonTypeInfo(use = JsonTypeInfo.Id.NONE, include = JsonTypeInfo.As.EXISTING_PROPERTY)
26         interface MyModelChildBase {
27             @JsonView(MyModelView.class)
getName()28             public String getName();
29         }
30 
31     }
32 
33     @JsonPropertyOrder({ "format", "child" })
34     static class MyModelRoot {
35         @JsonProperty
36         private String format = "1.0";
37 
getFormat()38         public String getFormat() {
39             return format;
40         }
41         @JsonProperty
42         private MyModelChildBase child;
43 
getChild()44         public MyModelChildBase getChild() {
45             return child;
46         }
47 
setChild(MyModelChildBase child)48         public void setChild(MyModelChildBase child) {
49             this.child = child;
50         }
51 
52         @JsonProperty
53         private String notVisible = "should not be present";
54 
getNotVisible()55         public String getNotVisible() {
56             return notVisible;
57         }
58     }
59 
60     @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
61     @JsonSubTypes({
62             @JsonSubTypes.Type(value = MyChildA.class, name = "CHILD_A"),
63             @JsonSubTypes.Type(value = MyChildB.class, name = "CHILD_B")
64     })
65     abstract static class MyModelChildBase {
66         @JsonProperty
67         private String name;
68 
getName()69         public String getName() {
70             return name;
71         }
72 
73         @JsonIgnore
setName(String name)74         public void setName(String name) {
75             this.name = name;
76         }
77     }
78 
79     static class MyChildA extends MyModelChildBase {
MyChildA(String name)80         public MyChildA(String name) {
81             setName(name);
82         }
83     }
84 
85     static class MyChildB extends MyModelChildBase {
MyChildB(String name)86         public MyChildB(String name) {
87             setName(name);
88         }
89     }
90 
testB_KO()91     public void testB_KO() throws Exception
92     {
93         final ObjectMapper DEFAULT = defaultMapper();
94         MyModelRoot myModelInstance = new MyModelRoot();
95         myModelInstance.setChild(new MyChildB("testB"));
96 
97         ObjectMapper myObjectMapper = DEFAULT.copy();
98 
99         String postResult = getString(myModelInstance, myObjectMapper);
100         assertEquals(FULLMODEL, postResult);
101 //        System.out.println("postResult: "+postResult);
102 
103         myObjectMapper = DEFAULT.copy();
104 //        myObjectMapper = defaultMapper();
105         myObjectMapper.addMixIn(MyModelRoot.class, MixinConfig.MyModelRoot.class)
106                 .addMixIn(MyModelChildBase.class, MixinConfig.MyModelChildBase.class)
107                 .disable(MapperFeature.DEFAULT_VIEW_INCLUSION)
108                 .setConfig(myObjectMapper.getSerializationConfig().withView(MyModelView.class));
109 
110         String result = getString(myModelInstance, myObjectMapper);
111         assertEquals(EXPECTED, result);
112 
113     }
114 
getString(MyModelRoot myModelInstance, ObjectMapper myObjectMapper)115     private String getString(MyModelRoot myModelInstance, ObjectMapper myObjectMapper) throws IOException {
116         return myObjectMapper.writerFor(MyModelRoot.class).writeValueAsString(myModelInstance);
117     }
118 
defaultMapper()119     private ObjectMapper defaultMapper()
120     {
121         return jsonMapperBuilder()
122                 .defaultPropertyInclusion(JsonInclude.Value.construct(JsonInclude.Include.NON_EMPTY,
123                         JsonInclude.Include.NON_EMPTY))
124                 .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
125                 .configure(MapperFeature.ALLOW_COERCION_OF_SCALARS, false)
126                 .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true)
127                 .build();
128     }
129 }
130