| package com.fasterxml.jackson.databind.deser.merge; |
| |
| import com.fasterxml.jackson.annotation.JsonMerge; |
| import com.fasterxml.jackson.annotation.JsonSetter; |
| import com.fasterxml.jackson.annotation.Nulls; |
| import com.fasterxml.jackson.databind.BaseMapTest; |
| import com.fasterxml.jackson.databind.MapperFeature; |
| import com.fasterxml.jackson.databind.ObjectMapper; |
| |
| public class MergeWithNullTest extends BaseMapTest |
| { |
| static class ConfigDefault { |
| @JsonMerge |
| public AB loc = new AB(1, 2); |
| |
| protected ConfigDefault() { } |
| public ConfigDefault(int a, int b) { |
| loc = new AB(a, b); |
| } |
| } |
| |
| static class ConfigSkipNull { |
| @JsonMerge |
| @JsonSetter(nulls=Nulls.SKIP) |
| public AB loc = new AB(1, 2); |
| |
| protected ConfigSkipNull() { } |
| public ConfigSkipNull(int a, int b) { |
| loc = new AB(a, b); |
| } |
| } |
| |
| static class ConfigAllowNullOverwrite { |
| @JsonMerge |
| @JsonSetter(nulls=Nulls.SET) |
| public AB loc = new AB(1, 2); |
| |
| protected ConfigAllowNullOverwrite() { } |
| public ConfigAllowNullOverwrite(int a, int b) { |
| loc = new AB(a, b); |
| } |
| } |
| |
| // another variant where all we got is a getter |
| static class NoSetterConfig { |
| AB _value = new AB(2, 3); |
| |
| @JsonMerge |
| public AB getValue() { return _value; } |
| } |
| |
| static class AB { |
| public int a; |
| public int b; |
| |
| protected AB() { } |
| public AB(int a0, int b0) { |
| a = a0; |
| b = b0; |
| } |
| } |
| |
| /* |
| /********************************************************** |
| /* Test methods |
| /********************************************************** |
| */ |
| |
| private final ObjectMapper MAPPER = newObjectMapper() |
| // 26-Oct-2016, tatu: Make sure we'll report merge problems by default |
| .disable(MapperFeature.IGNORE_MERGE_FOR_UNMERGEABLE) |
| ; |
| |
| public void testBeanMergingWithNullDefault() throws Exception |
| { |
| // By default `null` should simply overwrite value |
| ConfigDefault config = MAPPER.readerForUpdating(new ConfigDefault(5, 7)) |
| .readValue(aposToQuotes("{'loc':null}")); |
| assertNotNull(config); |
| assertNull(config.loc); |
| |
| // but it should be possible to override setting to, say, skip |
| |
| // First: via specific type override |
| // important! We'll specify for value type to be merged |
| ObjectMapper mapper = newObjectMapper(); |
| mapper.configOverride(AB.class) |
| .setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SKIP)); |
| config = mapper.readerForUpdating(new ConfigDefault(137, -3)) |
| .readValue(aposToQuotes("{'loc':null}")); |
| assertNotNull(config.loc); |
| assertEquals(137, config.loc.a); |
| assertEquals(-3, config.loc.b); |
| |
| // Second: by global defaults |
| mapper = newObjectMapper(); |
| mapper.setDefaultSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SKIP)); |
| config = mapper.readerForUpdating(new ConfigDefault(12, 34)) |
| .readValue(aposToQuotes("{'loc':null}")); |
| assertNotNull(config.loc); |
| assertEquals(12, config.loc.a); |
| assertEquals(34, config.loc.b); |
| } |
| |
| public void testBeanMergingWithNullSkip() throws Exception |
| { |
| ConfigSkipNull config = MAPPER.readerForUpdating(new ConfigSkipNull(5, 7)) |
| .readValue(aposToQuotes("{'loc':null}")); |
| assertNotNull(config); |
| assertNotNull(config.loc); |
| assertEquals(5, config.loc.a); |
| assertEquals(7, config.loc.b); |
| } |
| |
| public void testBeanMergingWithNullSet() throws Exception |
| { |
| ConfigAllowNullOverwrite config = MAPPER.readerForUpdating(new ConfigAllowNullOverwrite(5, 7)) |
| .readValue(aposToQuotes("{'loc':null}")); |
| assertNotNull(config); |
| assertNull(config.loc); |
| } |
| |
| public void testSetterlessMergingWithNull() throws Exception |
| { |
| NoSetterConfig input = new NoSetterConfig(); |
| NoSetterConfig result = MAPPER.readerForUpdating(input) |
| .readValue(aposToQuotes("{'value':null}")); |
| assertNotNull(result.getValue()); |
| assertEquals(2, result.getValue().a); |
| assertEquals(3, result.getValue().b); |
| assertSame(input, result); |
| } |
| } |