1 package com.fasterxml.jackson.databind.mixins; 2 3 import java.util.*; 4 5 import com.fasterxml.jackson.annotation.*; 6 7 import com.fasterxml.jackson.databind.*; 8 9 public class TestMixinSerWithViews 10 extends BaseMapTest 11 { 12 /* 13 /********************************************************** 14 /* Helper bean classes 15 /********************************************************** 16 */ 17 18 static class SimpleTestData 19 { 20 private String name = "shown"; 21 private String nameHidden = "hidden"; 22 getName()23 public String getName() { return name; } getNameHidden( )24 public String getNameHidden( ) { return nameHidden; } 25 setName( String name )26 public void setName( String name ) { 27 this.name = name; 28 } 29 setNameHidden( String nameHidden )30 public void setNameHidden( String nameHidden ) { 31 this.nameHidden = nameHidden; 32 } 33 } 34 35 static class ComplexTestData 36 { 37 String nameNull = null; 38 39 String nameComplex = "complexValue"; 40 41 String nameComplexHidden = "nameComplexHiddenValue"; 42 43 SimpleTestData testData = new SimpleTestData( ); 44 45 SimpleTestData[] testDataArray = new SimpleTestData[] { new SimpleTestData( ), null }; 46 getNameNull()47 public String getNameNull() 48 { 49 return nameNull; 50 } 51 setNameNull( String nameNull )52 public void setNameNull( String nameNull ) 53 { 54 this.nameNull = nameNull; 55 } 56 getNameComplex()57 public String getNameComplex() 58 { 59 return nameComplex; 60 } 61 setNameComplex( String nameComplex )62 public void setNameComplex( String nameComplex ) 63 { 64 this.nameComplex = nameComplex; 65 } 66 getNameComplexHidden()67 public String getNameComplexHidden() 68 { 69 return nameComplexHidden; 70 } 71 setNameComplexHidden( String nameComplexHidden )72 public void setNameComplexHidden( String nameComplexHidden ) 73 { 74 this.nameComplexHidden = nameComplexHidden; 75 } 76 getTestData()77 public SimpleTestData getTestData() 78 { 79 return testData; 80 } 81 setTestData( SimpleTestData testData )82 public void setTestData( SimpleTestData testData ) 83 { 84 this.testData = testData; 85 } 86 getTestDataArray()87 public SimpleTestData[] getTestDataArray() 88 { 89 return testDataArray; 90 } 91 setTestDataArray( SimpleTestData[] testDataArray )92 public void setTestDataArray( SimpleTestData[] testDataArray ) 93 { 94 this.testDataArray = testDataArray; 95 } 96 } 97 98 public interface TestDataJAXBMixin 99 { 100 @JsonView( Views.View.class ) getName( )101 String getName( ); 102 } 103 104 public interface TestComplexDataJAXBMixin 105 { 106 @JsonView( Views.View.class ) getNameNull()107 String getNameNull(); 108 109 @JsonView( Views.View.class ) getNameComplex()110 String getNameComplex(); 111 112 @JsonView( Views.View.class ) getNameComplexHidden()113 String getNameComplexHidden(); 114 115 @JsonView( Views.View.class ) getTestData()116 SimpleTestData getTestData(); 117 118 @JsonView( Views.View.class ) getTestDataArray( )119 SimpleTestData[] getTestDataArray( ); 120 } 121 122 static class Views { 123 static class View { } 124 } 125 126 public class A { 127 private String name; 128 private int age; 129 private String surname; 130 A(String name, int age, String surname)131 public A(String name, int age, String surname) { super(); this.name = name; this.age = age; this.surname = surname; } 132 getName()133 public String getName() { return name; } 134 setName(String name)135 public void setName(String name) { this.name = name; } 136 getAge()137 public int getAge() { return age; } 138 setAge(int age)139 public void setAge(int age) { this.age = age; } 140 getSurname()141 public String getSurname() { return surname; } 142 setSurname(String surname)143 public void setSurname(String surname) { this.surname = surname; } 144 } 145 146 public interface AView { } 147 148 public abstract class AMixInAnnotation { 149 @JsonProperty("name") 150 @JsonView(AView.class) getName()151 abstract String getName(); 152 @JsonProperty("age") @JsonView(AView.class) getAge()153 abstract int getAge(); 154 } 155 156 /* 157 /********************************************************** 158 /* Tests 159 /********************************************************** 160 */ 161 testDataBindingUsage( )162 public void testDataBindingUsage( ) throws Exception 163 { 164 ObjectMapper objectMapper = createObjectMapper(); 165 ObjectWriter objectWriter = objectMapper.writerWithView(Views.View.class).withDefaultPrettyPrinter(); 166 Object object = new ComplexTestData(); 167 String json = objectWriter.writeValueAsString(object); 168 assertTrue( json.indexOf( "nameHidden" ) == -1 ); 169 assertTrue( json.indexOf( "\"name\" : \"shown\"" ) > 0 ); 170 } 171 testIssue560()172 public void testIssue560() throws Exception 173 { 174 A a = new A("myname", 29, "mysurname"); 175 176 // Property SerializationConfig.SerializationFeature.DEFAULT_VIEW_INCLUSION set to false 177 ObjectMapper mapper = jsonMapperBuilder() 178 .configure(MapperFeature.DEFAULT_VIEW_INCLUSION, Boolean.FALSE) 179 .addMixIn(A.class, AMixInAnnotation.class) 180 .build(); 181 String json = mapper.writerWithView(AView.class).writeValueAsString(a); 182 183 assertTrue(json.indexOf("\"name\"") > 0); 184 } 185 186 /* 187 /********************************************************** 188 /* Helper methods 189 /********************************************************** 190 */ 191 createObjectMapper()192 private ObjectMapper createObjectMapper() 193 { 194 ObjectMapper objectMapper = jsonMapperBuilder() 195 .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false ) 196 .serializationInclusion(JsonInclude.Include.NON_NULL ) 197 .configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false ) 198 .build(); 199 200 Map<Class<?>, Class<?>> sourceMixins = new HashMap<Class<?>, Class<?>>( ); 201 sourceMixins.put( SimpleTestData.class, TestDataJAXBMixin.class ); 202 sourceMixins.put( ComplexTestData.class, TestComplexDataJAXBMixin.class ); 203 204 objectMapper.setMixIns(sourceMixins); 205 return objectMapper; 206 } 207 } 208