From aa0030d546860eedc3d540a9f00c101eefc7e90b Mon Sep 17 00:00:00 2001 From: eugenp Date: Tue, 24 Dec 2013 01:38:09 +0200 Subject: [PATCH] mapping work --- .../src/test/java/dtos/MyDtoNoAccessors.java | 6 +- .../MyDtoNoAccessorsAndFieldVisibility.java | 25 +++ .../JacksonSerializationIgnoreUnitTest.java | 187 ++++++++++++++++++ .../test/JacksonSerializationUnitTest.java | 169 +++------------- 4 files changed, 238 insertions(+), 149 deletions(-) create mode 100644 jackson/src/test/java/dtos/MyDtoNoAccessorsAndFieldVisibility.java create mode 100644 jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java diff --git a/jackson/src/test/java/dtos/MyDtoNoAccessors.java b/jackson/src/test/java/dtos/MyDtoNoAccessors.java index 3988f714b2..4b3b9799b3 100644 --- a/jackson/src/test/java/dtos/MyDtoNoAccessors.java +++ b/jackson/src/test/java/dtos/MyDtoNoAccessors.java @@ -2,9 +2,9 @@ package dtos; public class MyDtoNoAccessors { - private String stringValue; - private int intValue; - private boolean booleanValue; + String stringValue; + int intValue; + boolean booleanValue; public MyDtoNoAccessors() { super(); diff --git a/jackson/src/test/java/dtos/MyDtoNoAccessorsAndFieldVisibility.java b/jackson/src/test/java/dtos/MyDtoNoAccessorsAndFieldVisibility.java new file mode 100644 index 0000000000..74fdbae58f --- /dev/null +++ b/jackson/src/test/java/dtos/MyDtoNoAccessorsAndFieldVisibility.java @@ -0,0 +1,25 @@ +package dtos; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; + +@JsonAutoDetect(fieldVisibility = Visibility.ANY) +public class MyDtoNoAccessorsAndFieldVisibility { + + String stringValue; + int intValue; + boolean booleanValue; + + public MyDtoNoAccessorsAndFieldVisibility() { + super(); + } + + public MyDtoNoAccessorsAndFieldVisibility(final String stringValue, final int intValue, final boolean booleanValue) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.booleanValue = booleanValue; + } + +} diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java b/jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java new file mode 100644 index 0000000000..ec692f5bcd --- /dev/null +++ b/jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java @@ -0,0 +1,187 @@ +package org.baeldung.jackson.test; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertThat; + +import java.io.IOException; + +import org.junit.Test; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; +import com.fasterxml.jackson.databind.ser.FilterProvider; +import com.fasterxml.jackson.databind.ser.PropertyFilter; +import com.fasterxml.jackson.databind.ser.PropertyWriter; +import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; +import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; + +import dtos.MyDto; +import dtos.MyDtoIgnoreField; +import dtos.MyDtoIgnoreFieldByName; +import dtos.MyDtoIgnoreNull; +import dtos.MyDtoIncludeNonDefault; +import dtos.MyDtoWithFilter; +import dtos.MyMixInForString; + +public class JacksonSerializationIgnoreUnitTest { + + // tests - single entity to json + + // ignore + + @Test + public final void givenOnlyNonDefaultValuesAreSerializedAndDtoHasOnlyDefaultValues_whenSerializing_thenCorrect() throws JsonParseException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + final String dtoAsString = mapper.writeValueAsString(new MyDtoIncludeNonDefault()); + + assertThat(dtoAsString, not(containsString("intValue"))); + System.out.println(dtoAsString); + } + + @Test + public final void givenOnlyNonDefaultValuesAreSerializedAndDtoHasNonDefaultValue_whenSerializing_thenCorrect() throws JsonParseException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + final MyDtoIncludeNonDefault dtoObject = new MyDtoIncludeNonDefault(); + dtoObject.setBooleanValue(true); + + final String dtoAsString = mapper.writeValueAsString(dtoObject); + + assertThat(dtoAsString, containsString("booleanValue")); + System.out.println(dtoAsString); + } + + @Test + public final void givenFieldIsIgnoredByName_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + final MyDtoIgnoreFieldByName dtoObject = new MyDtoIgnoreFieldByName(); + dtoObject.setBooleanValue(true); + + final String dtoAsString = mapper.writeValueAsString(dtoObject); + + assertThat(dtoAsString, not(containsString("intValue"))); + assertThat(dtoAsString, containsString("booleanValue")); + System.out.println(dtoAsString); + } + + @Test + public final void givenFieldIsIgnoredDirectly_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + final MyDtoIgnoreField dtoObject = new MyDtoIgnoreField(); + + final String dtoAsString = mapper.writeValueAsString(dtoObject); + + assertThat(dtoAsString, not(containsString("intValue"))); + assertThat(dtoAsString, containsString("booleanValue")); + System.out.println(dtoAsString); + } + + @Test + public final void givenFieldTypeIsIgnored_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + mapper.addMixInAnnotations(String.class, MyMixInForString.class); + final MyDto dtoObject = new MyDto(); + dtoObject.setBooleanValue(true); + + final String dtoAsString = mapper.writeValueAsString(dtoObject); + + assertThat(dtoAsString, containsString("intValue")); + assertThat(dtoAsString, containsString("booleanValue")); + assertThat(dtoAsString, not(containsString("stringValue"))); + System.out.println(dtoAsString); + } + + @Test + public final void givenTypeHasFilterThatIgnoresFieldByName_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { + final ObjectMapper mapper = new ObjectMapper(); + final SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter.serializeAllExcept("intValue"); + final FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter); + + final MyDtoWithFilter dtoObject = new MyDtoWithFilter(); + dtoObject.setIntValue(12); + + final String dtoAsString = mapper.writer(filters).writeValueAsString(dtoObject); + + assertThat(dtoAsString, not(containsString("intValue"))); + assertThat(dtoAsString, containsString("booleanValue")); + assertThat(dtoAsString, containsString("stringValue")); + System.out.println(dtoAsString); + } + + @Test + public final void givenTypeHasFilterThatIgnoresNegativeInt_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { + final PropertyFilter theFilter = new SimpleBeanPropertyFilter() { + @Override + public final void serializeAsField(final Object pojo, final JsonGenerator jgen, final SerializerProvider provider, final PropertyWriter writer) throws Exception { + if (include(writer)) { + if (!writer.getName().equals("intValue")) { + writer.serializeAsField(pojo, jgen, provider); + return; + } + + final int intValue = ((MyDtoWithFilter) pojo).getIntValue(); + if (intValue >= 0) { + writer.serializeAsField(pojo, jgen, provider); + } + } else if (!jgen.canOmitFields()) { // since 2.3 + writer.serializeAsOmittedField(pojo, jgen, provider); + } + } + + @Override + protected final boolean include(final BeanPropertyWriter writer) { + return true; + } + + @Override + protected final boolean include(final PropertyWriter writer) { + return true; + } + }; + final FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter); + + final MyDtoWithFilter dtoObject = new MyDtoWithFilter(); + dtoObject.setIntValue(-1); + + final ObjectMapper mapper = new ObjectMapper(); + final String dtoAsString = mapper.writer(filters).writeValueAsString(dtoObject); + + assertThat(dtoAsString, not(containsString("intValue"))); + assertThat(dtoAsString, containsString("booleanValue")); + assertThat(dtoAsString, containsString("stringValue")); + System.out.println(dtoAsString); + } + + @Test + public final void givenIgnoringNullFieldsOnClass_whenWritingObjectWithNullField_thenFieldIsIgnored() throws JsonProcessingException { + final ObjectMapper mapper = new ObjectMapper(); + final MyDtoIgnoreNull dtoObject = new MyDtoIgnoreNull(); + + final String dtoAsString = mapper.writeValueAsString(dtoObject); + + assertThat(dtoAsString, containsString("intValue")); + assertThat(dtoAsString, containsString("booleanValue")); + assertThat(dtoAsString, not(containsString("stringValue"))); + System.out.println(dtoAsString); + } + + @Test + public final void givenIgnoringNullFieldsGlobally_whenWritingObjectWithNullField_thenIgnored() throws JsonProcessingException { + final ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_NULL); + final MyDto dtoObject = new MyDto(); + + final String dtoAsString = mapper.writeValueAsString(dtoObject); + + assertThat(dtoAsString, containsString("intValue")); + assertThat(dtoAsString, containsString("booleanValue")); + assertThat(dtoAsString, not(containsString("stringValue"))); + System.out.println(dtoAsString); + } + +} diff --git a/jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationUnitTest.java b/jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationUnitTest.java index 177ef19afe..3ead818426 100644 --- a/jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationUnitTest.java +++ b/jackson/src/test/java/org/baeldung/jackson/test/JacksonSerializationUnitTest.java @@ -2,6 +2,7 @@ package org.baeldung.jackson.test; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; import java.io.IOException; @@ -9,52 +10,30 @@ import java.util.List; import org.junit.Test; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; -import com.fasterxml.jackson.databind.ser.FilterProvider; -import com.fasterxml.jackson.databind.ser.PropertyFilter; -import com.fasterxml.jackson.databind.ser.PropertyWriter; -import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; -import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; import com.google.common.collect.Lists; import dtos.MyDto; import dtos.MyDtoFieldNameChanged; -import dtos.MyDtoIgnoreField; -import dtos.MyDtoIgnoreFieldByName; -import dtos.MyDtoIgnoreNull; -import dtos.MyDtoIncludeNonDefault; -import dtos.MyDtoWithFilter; -import dtos.MyMixInForString; +import dtos.MyDtoNoAccessors; +import dtos.MyDtoNoAccessorsAndFieldVisibility; public class JacksonSerializationUnitTest { // tests - single entity to json @Test - public final void givenOnlyNonDefaultValuesAreSerializedAndDtoHasOnlyDefaultValues_whenSerializing_thenCorrect() throws JsonParseException, IOException { + public final void whenSerializing_thenCorrect() throws JsonParseException, IOException { final ObjectMapper mapper = new ObjectMapper(); - final String dtoAsString = mapper.writeValueAsString(new MyDtoIncludeNonDefault()); - - assertThat(dtoAsString, not(containsString("intValue"))); - System.out.println(dtoAsString); - } - - @Test - public final void givenOnlyNonDefaultValuesAreSerializedAndDtoHasNonDefaultValue_whenSerializing_thenCorrect() throws JsonParseException, IOException { - final ObjectMapper mapper = new ObjectMapper(); - final MyDtoIncludeNonDefault dtoObject = new MyDtoIncludeNonDefault(); - dtoObject.setBooleanValue(true); - - final String dtoAsString = mapper.writeValueAsString(dtoObject); + final String dtoAsString = mapper.writeValueAsString(new MyDto()); + assertThat(dtoAsString, containsString("intValue")); + assertThat(dtoAsString, containsString("stringValue")); assertThat(dtoAsString, containsString("booleanValue")); - System.out.println(dtoAsString); } @Test @@ -70,134 +49,32 @@ public class JacksonSerializationUnitTest { System.out.println(dtoAsString); } - // ignore + @Test(expected = JsonMappingException.class) + public final void givenObjectHasNoAccessors_whenSerializing_thenException() throws JsonParseException, IOException { + final String dtoAsString = new ObjectMapper().writeValueAsString(new MyDtoNoAccessors()); - @Test - public final void givenFieldIsIgnoredByName_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { - final ObjectMapper mapper = new ObjectMapper(); - final MyDtoIgnoreFieldByName dtoObject = new MyDtoIgnoreFieldByName(); - dtoObject.setBooleanValue(true); - - final String dtoAsString = mapper.writeValueAsString(dtoObject); - - assertThat(dtoAsString, not(containsString("intValue"))); - assertThat(dtoAsString, containsString("booleanValue")); - System.out.println(dtoAsString); + assertThat(dtoAsString, notNullValue()); } @Test - public final void givenFieldIsIgnoredDirectly_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { - final ObjectMapper mapper = new ObjectMapper(); - final MyDtoIgnoreField dtoObject = new MyDtoIgnoreField(); - - final String dtoAsString = mapper.writeValueAsString(dtoObject); - - assertThat(dtoAsString, not(containsString("intValue"))); - assertThat(dtoAsString, containsString("booleanValue")); - System.out.println(dtoAsString); - } - - @Test - public final void givenFieldTypeIsIgnored_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { - final ObjectMapper mapper = new ObjectMapper(); - mapper.addMixInAnnotations(String.class, MyMixInForString.class); - final MyDto dtoObject = new MyDto(); - dtoObject.setBooleanValue(true); - - final String dtoAsString = mapper.writeValueAsString(dtoObject); + public final void givenObjectHasNoAccessors_whenSerializingWithPrivateFieldsVisibility_thenNoException() throws JsonParseException, IOException { + final ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); + final String dtoAsString = objectMapper.writeValueAsString(new MyDtoNoAccessors()); assertThat(dtoAsString, containsString("intValue")); - assertThat(dtoAsString, containsString("booleanValue")); - assertThat(dtoAsString, not(containsString("stringValue"))); - System.out.println(dtoAsString); - } - - @Test - public final void givenTypeHasFilterThatIgnoresFieldByName_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { - final ObjectMapper mapper = new ObjectMapper(); - final SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter.serializeAllExcept("intValue"); - final FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter); - - final MyDtoWithFilter dtoObject = new MyDtoWithFilter(); - dtoObject.setIntValue(12); - - final String dtoAsString = mapper.writer(filters).writeValueAsString(dtoObject); - - assertThat(dtoAsString, not(containsString("intValue"))); - assertThat(dtoAsString, containsString("booleanValue")); assertThat(dtoAsString, containsString("stringValue")); - System.out.println(dtoAsString); + assertThat(dtoAsString, containsString("booleanValue")); } @Test - public final void givenTypeHasFilterThatIgnoresNegativeInt_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { - final PropertyFilter theFilter = new SimpleBeanPropertyFilter() { - @Override - public final void serializeAsField(final Object pojo, final JsonGenerator jgen, final SerializerProvider provider, final PropertyWriter writer) throws Exception { - if (include(writer)) { - if (!writer.getName().equals("intValue")) { - writer.serializeAsField(pojo, jgen, provider); - return; - } + public final void givenObjectHasNoAccessorsButHasVisibleFields_whenSerializing_thenNoException() throws JsonParseException, IOException { + final ObjectMapper objectMapper = new ObjectMapper(); + final String dtoAsString = objectMapper.writeValueAsString(new MyDtoNoAccessorsAndFieldVisibility()); - final int intValue = ((MyDtoWithFilter) pojo).getIntValue(); - if (intValue >= 0) { - writer.serializeAsField(pojo, jgen, provider); - } - } else if (!jgen.canOmitFields()) { // since 2.3 - writer.serializeAsOmittedField(pojo, jgen, provider); - } - } - - @Override - protected final boolean include(final BeanPropertyWriter writer) { - return true; - } - - @Override - protected final boolean include(final PropertyWriter writer) { - return true; - } - }; - final FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter); - - final MyDtoWithFilter dtoObject = new MyDtoWithFilter(); - dtoObject.setIntValue(-1); - - final ObjectMapper mapper = new ObjectMapper(); - final String dtoAsString = mapper.writer(filters).writeValueAsString(dtoObject); - - assertThat(dtoAsString, not(containsString("intValue"))); - assertThat(dtoAsString, containsString("booleanValue")); + assertThat(dtoAsString, containsString("intValue")); assertThat(dtoAsString, containsString("stringValue")); - System.out.println(dtoAsString); - } - - @Test - public final void givenIgnoringNullFieldsOnClass_whenWritingObjectWithNullField_thenFieldIsIgnored() throws JsonProcessingException { - final ObjectMapper mapper = new ObjectMapper(); - final MyDtoIgnoreNull dtoObject = new MyDtoIgnoreNull(); - - final String dtoAsString = mapper.writeValueAsString(dtoObject); - - assertThat(dtoAsString, containsString("intValue")); assertThat(dtoAsString, containsString("booleanValue")); - assertThat(dtoAsString, not(containsString("stringValue"))); - System.out.println(dtoAsString); - } - - @Test - public final void givenIgnoringNullFieldsGlobally_whenWritingObjectWithNullField_thenIgnored() throws JsonProcessingException { - final ObjectMapper mapper = new ObjectMapper(); - mapper.setSerializationInclusion(Include.NON_NULL); - final MyDto dtoObject = new MyDto(); - - final String dtoAsString = mapper.writeValueAsString(dtoObject); - - assertThat(dtoAsString, containsString("intValue")); - assertThat(dtoAsString, containsString("booleanValue")); - assertThat(dtoAsString, not(containsString("stringValue"))); - System.out.println(dtoAsString); } // tests - multiple entities to json