From 2eb1b91b3d285e9c4d53abd863ec4b2b3ebef721 Mon Sep 17 00:00:00 2001 From: Robert Alblas Date: Mon, 27 May 2019 14:52:10 +0200 Subject: [PATCH] Allowing the client to let beanmapper map null collections to null collections --- .../io/beanmapper/config/BeanMapperBuilder.java | 10 ++++++++++ .../java/io/beanmapper/config/Configuration.java | 11 +++++++++++ .../io/beanmapper/config/CoreConfiguration.java | 15 +++++++++++++++ .../beanmapper/config/OverrideConfiguration.java | 13 +++++++++++++ .../collections/CollectionConverter.java | 2 +- src/test/java/io/beanmapper/BeanMapperTest.java | 11 +++++++++++ 6 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/beanmapper/config/BeanMapperBuilder.java b/src/main/java/io/beanmapper/config/BeanMapperBuilder.java index 1bd96a3a..5b32c099 100644 --- a/src/main/java/io/beanmapper/config/BeanMapperBuilder.java +++ b/src/main/java/io/beanmapper/config/BeanMapperBuilder.java @@ -194,6 +194,16 @@ public BeanMapperBuilder setUseNullValue() { return this; } + public BeanMapperBuilder setUseNullValue(boolean useNullValue) { + this.configuration.setUseNullValue(useNullValue); + return this; + } + + public BeanMapperBuilder setUseCollectionNullValue(boolean useCollectionNullValue) { + this.configuration.setUseCollectionNullValue(useCollectionNullValue); + return this; + } + public BeanMapper build() { BeanMapper beanMapper = new BeanMapper(configuration); // Custom collection handlers must be registered before default ones diff --git a/src/main/java/io/beanmapper/config/Configuration.java b/src/main/java/io/beanmapper/config/Configuration.java index 7d3b7e3f..94ed7a12 100644 --- a/src/main/java/io/beanmapper/config/Configuration.java +++ b/src/main/java/io/beanmapper/config/Configuration.java @@ -197,6 +197,12 @@ public interface Configuration { */ Boolean getUseNullValue(); + /** + * Property that determines if null values for the source collection must be skipped or not + * @return determines if null values must be skipped or not + */ + Boolean getUseCollectionNullValue(); + /** * The RoleSecuredCheck is responsible for checking if a Principal may access * a field or method annotated with @BeanRoleSecured. Returns the RoleSecuredCheck, @@ -419,4 +425,9 @@ public interface Configuration { */ void setUseNullValue(Boolean useNullValue); + /** + * Property that determines if null values for the source collections must be skipped or not + * @param useNullValue determines if null values must be skipped or not + */ + void setUseCollectionNullValue(Boolean useNullValue); } diff --git a/src/main/java/io/beanmapper/config/CoreConfiguration.java b/src/main/java/io/beanmapper/config/CoreConfiguration.java index 0ff1fbd5..7a7bc867 100644 --- a/src/main/java/io/beanmapper/config/CoreConfiguration.java +++ b/src/main/java/io/beanmapper/config/CoreConfiguration.java @@ -99,6 +99,12 @@ public class CoreConfiguration implements Configuration { */ private Boolean useNullValue = false; + /** + * Property that determines if null collections should be mapped to an empty collection or a null value. Normal + * behaviour is to create an empty list if a source value is null. + */ + private Boolean useCollectionNullValues = true; + @Override public List getDownsizeTarget() { return null; } @@ -244,6 +250,11 @@ public Boolean getUseNullValue() { return this.useNullValue; } + @Override + public Boolean getUseCollectionNullValue() { + return this.useCollectionNullValues; + } + @Override public RoleSecuredCheck getRoleSecuredCheck() { return this.roleSecuredCheck; @@ -414,4 +425,8 @@ public void setUseNullValue(Boolean useNullValue) { this.useNullValue = useNullValue; } + @Override + public void setUseCollectionNullValue(Boolean useNullValue) { + this.useCollectionNullValues = useNullValue; + } } diff --git a/src/main/java/io/beanmapper/config/OverrideConfiguration.java b/src/main/java/io/beanmapper/config/OverrideConfiguration.java index a0b25e12..ed0b1ef5 100644 --- a/src/main/java/io/beanmapper/config/OverrideConfiguration.java +++ b/src/main/java/io/beanmapper/config/OverrideConfiguration.java @@ -47,6 +47,8 @@ public class OverrideConfiguration implements Configuration { private OverrideField useNullValue; + private OverrideField useCollectionNullValue; + private OverrideField flushAfterClear; private OverrideField flushEnabled; @@ -64,6 +66,7 @@ public OverrideConfiguration(Configuration configuration) { this.flushAfterClear = new OverrideField<>(configuration::isFlushAfterClear); this.flushEnabled = new OverrideField<>(configuration::isFlushEnabled); this.useNullValue = new OverrideField<>(configuration::getUseNullValue); + this.useCollectionNullValue = new OverrideField<>(configuration::getUseCollectionNullValue); } @Override @@ -235,6 +238,11 @@ public Boolean getUseNullValue() { return useNullValue.get(); } + @Override + public Boolean getUseCollectionNullValue() { + return useCollectionNullValue.get(); + } + @Override public RoleSecuredCheck getRoleSecuredCheck() { return parentConfiguration.getRoleSecuredCheck(); @@ -397,4 +405,9 @@ public void setUseNullValue(Boolean useNullValue) { this.useNullValue.set(useNullValue); } + @Override + public void setUseCollectionNullValue(Boolean useNullValue) { + this.useCollectionNullValue.set(useNullValue); + } + } diff --git a/src/main/java/io/beanmapper/core/converter/collections/CollectionConverter.java b/src/main/java/io/beanmapper/core/converter/collections/CollectionConverter.java index 87bb26f2..c8a03b06 100644 --- a/src/main/java/io/beanmapper/core/converter/collections/CollectionConverter.java +++ b/src/main/java/io/beanmapper/core/converter/collections/CollectionConverter.java @@ -33,7 +33,7 @@ public T convert( .setFlushAfterClear(beanPropertyMatch.getCollectionInstructions().getFlushAfterClear()) .setTargetClass(beanPropertyMatch.getCollectionInstructions().getCollectionElementType().getType()) .setTarget(beanPropertyMatch.getTargetObject()) - .setUseNullValue() + .setUseNullValue(beanMapper.getConfiguration().getUseCollectionNullValue()) .build() .map(sourceCollection); } diff --git a/src/test/java/io/beanmapper/BeanMapperTest.java b/src/test/java/io/beanmapper/BeanMapperTest.java index fea97a57..1bbff73e 100644 --- a/src/test/java/io/beanmapper/BeanMapperTest.java +++ b/src/test/java/io/beanmapper/BeanMapperTest.java @@ -1619,6 +1619,17 @@ public void emptyListToExistingList() { assertEquals(targetItems, target.getItems()); } + @Test + public void nullListToNullList() { + BeanMapper beanMapper = new BeanMapperBuilder() + .setUseCollectionNullValue(false) + .build(); + CollectionListSource source = new CollectionListSource(); + source.items = null; + CollectionListTarget target = beanMapper.map(source, CollectionListTarget.class); + assertNull(target.items); + } + @Test public void useBeanPropertyPathToAccessGetterOnly() { SourceWithPerson source = new SourceWithPerson();