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