Skip to content

Commit

Permalink
Bugfix after issue #28
Browse files Browse the repository at this point in the history
  • Loading branch information
Rickvanderwaal committed Oct 8, 2015
1 parent 4d7aa7d commit 5adb0ae
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 3 deletions.
5 changes: 5 additions & 0 deletions src/main/java/io/beanmapper/core/BeanField.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import io.beanmapper.core.inspector.PropertyAccessors;
import io.beanmapper.exceptions.BeanMappingException;
import io.beanmapper.exceptions.NoSuchPropertyException;
import io.beanmapper.utils.DefaultValues;

import java.util.Stack;

Expand Down Expand Up @@ -92,6 +93,10 @@ public Object writeObject(Object source, Object parent) throws BeanMappingExcept
getNext().writeObject(null, getCurrentField().getValue(parent));
}
} else {
if(source == null && getCurrentField().getType().isPrimitive()) {
// Primitives types can't be null.
source = DefaultValues.defaultValueFor(getCurrentField().getType());
}
getCurrentField().setValue(parent, source);
}
return parent;
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/io/beanmapper/utils/DefaultValues.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.beanmapper.utils;

import java.util.HashMap;
import java.util.Map;

public class DefaultValues {

static final Map<Class<?>,Object> defaultValues = new HashMap<Class<?>,Object>()
{{
put(boolean.class, false);
put(byte.class, (byte) 0);
put(short.class, (short) 0);
put(int.class, 0);
put(long.class, 0L);
put(char.class, '\0');
put(float.class, 0.0F);
put(double.class, 0.0);
}};

@SuppressWarnings("unchecked")
public static<T> T defaultValueFor(Class<T> clazz) {
return (T)defaultValues.get(clazz);
}
}
10 changes: 8 additions & 2 deletions src/test/java/io/beanmapper/BeanMapperTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -233,16 +233,20 @@ public void emptySource() {
source.id = 42;
source.name = "sourceName";
source.emptyName = "notEmpty";
source.bool = true;
EmptyTarget target = beanMapper.map(source, EmptyTarget.class);
assertEquals(source.id, target.id, 0);
assertEquals(source.name, target.name);
assertEquals(source.emptyName, target.nestedEmptyClass.name);
assertEquals(source.bool, target.bool);
// Test with empty source
EmptySource emptySource = new EmptySource();
EmptyTarget emptyTarget = beanMapper.map(emptySource, EmptyTarget.class);
assertNull(emptyTarget.id);
assertEquals(0, emptyTarget.id, 0); // Default for primitive int is 0
assertNull(emptyTarget.name);
assertNull(emptyTarget.nestedEmptyClass);
assertNull(emptyTarget.nestedEmpty);
assertEquals(false, emptyTarget.bool); // Default for primitive boolean is false
}

@Test
Expand All @@ -252,14 +256,16 @@ public void emptySourceToExistingTarget() {
EmptyTarget existingTarget = new EmptyTarget();
existingTarget.id = 42;
existingTarget.name = "ExistingTargetName";
existingTarget.bool = true;
existingTarget.nestedEmptyClass = new NestedEmptyTarget();
existingTarget.nestedEmptyClass.name = "Hallo";
existingTarget.nestedEmpty = new NestedEmptyTarget();
existingTarget.nestedEmpty.name = "existingNestedTarget";

EmptyTarget mappedTarget = beanMapper.map(source, existingTarget);
assertNull(mappedTarget.id);
assertEquals(0, mappedTarget.id, 0);// Default for primitive int is 0
assertNull(mappedTarget.name);
assertEquals(false, mappedTarget.bool);// Default for primitive boolean is false
assertNull(mappedTarget.nestedEmptyClass.name);
assertNull(mappedTarget.nestedEmpty);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ public class EmptySource {

public Integer id;
public String name;
public Boolean bool;
@BeanProperty(name = "nestedEmptyClass.name")
public String emptyName;
public NestedEmptySource nestedEmpty;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

public class EmptyTarget {

public Integer id;
public int id;
public String name;
public boolean bool;
public NestedEmptyTarget nestedEmptyClass;
public NestedEmptyTarget nestedEmpty;
}

0 comments on commit 5adb0ae

Please sign in to comment.