From 1f9af561589c3587c2658a10ece4638ab6362da3 Mon Sep 17 00:00:00 2001 From: Jon Brisbin Date: Mon, 14 Mar 2011 10:53:31 -0500 Subject: [PATCH] More tweaks to complex/simple type detection, add makeAccessible() call to BasicMappingContext --- .../data/mapping/BasicMappingContext.java | 8 +++---- .../data/mapping/BasicPersistentProperty.java | 2 +- .../data/mapping/MappingBeanHelper.java | 22 +++++++------------ 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/mapping/BasicMappingContext.java b/spring-data-commons-core/src/main/java/org/springframework/data/mapping/BasicMappingContext.java index 945c0e190..25741d5f6 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/mapping/BasicMappingContext.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/mapping/BasicMappingContext.java @@ -92,15 +92,15 @@ public class BasicMappingContext implements MappingContext, InitializingBean { for (PropertyDescriptor descriptor : info.getPropertyDescriptors()) { descriptors.put(descriptor.getName(), descriptor); } - + ReflectionUtils.doWithFields(type, new FieldCallback() { - + @Override public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { - try { PropertyDescriptor descriptor = descriptors.get(field.getName()); if (builder.isPersistentProperty(field, descriptor)) { + ReflectionUtils.makeAccessible(field); PersistentProperty property = builder.createPersistentProperty(field, descriptor); property.setOwner(entity); entity.addPersistentProperty(property); @@ -108,7 +108,7 @@ public class BasicMappingContext implements MappingContext, InitializingBean { Association association = builder.createAssociation(property); entity.addAssociation(association); } - + if (property.isIdProperty()) { entity.setIdProperty(property); } diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/mapping/BasicPersistentProperty.java b/spring-data-commons-core/src/main/java/org/springframework/data/mapping/BasicPersistentProperty.java index a5812279f..621fbaa72 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/mapping/BasicPersistentProperty.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/mapping/BasicPersistentProperty.java @@ -129,7 +129,7 @@ public class BasicPersistentProperty implements PersistentProperty { @Override public boolean isComplexType() { - if (isCollection() || field.getType().isArray()) { + if (isCollection() || type.isArray()) { return !MappingBeanHelper.isSimpleType(getComponentType()); } else { return !MappingBeanHelper.isSimpleType(field.getType()); diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/mapping/MappingBeanHelper.java b/spring-data-commons-core/src/main/java/org/springframework/data/mapping/MappingBeanHelper.java index bdb9bdd8b..966121bc5 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/mapping/MappingBeanHelper.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/mapping/MappingBeanHelper.java @@ -150,8 +150,8 @@ public abstract class MappingBeanHelper { throws IllegalAccessException, InvocationTargetException { Field field = property.getField(); - if (fieldAccessOnly || (null == property.getPropertyDescriptor() || null == property.getPropertyDescriptor().getWriteMethod())) { - field.setAccessible(true); + Method setter = (null != property.getPropertyDescriptor() ? property.getPropertyDescriptor().getWriteMethod() : null); + if (fieldAccessOnly || null == setter) { if (null != value && value.getClass().isAssignableFrom(field.getType())) { field.set(on, value); } else { @@ -160,7 +160,6 @@ public abstract class MappingBeanHelper { return; } - Method setter = property.getPropertyDescriptor().getWriteMethod(); Class[] paramTypes = setter.getParameterTypes(); if (null != value && paramTypes.length > 0 && !value.getClass().isAssignableFrom(paramTypes[0])) { setter.invoke(on, conversionService.convert(value, paramTypes[0])); @@ -175,19 +174,14 @@ public abstract class MappingBeanHelper { Class type, boolean fieldAccessOnly) throws IllegalAccessException, InvocationTargetException { - + Object obj; Field field = property.getField(); - if (fieldAccessOnly || (null == property.getPropertyDescriptor() || null == property.getPropertyDescriptor().getReadMethod())) { - field.setAccessible(true); - Object obj = field.get(from); - if (null != obj && !obj.getClass().isAssignableFrom(type)) { - return conversionService.convert(obj, type); - } else { - return (T) obj; - } + Method getter = (null != property.getPropertyDescriptor() ? property.getPropertyDescriptor().getReadMethod() : null); + if (fieldAccessOnly || null == getter) { + obj = field.get(from); + } else { + obj = getter.invoke(from); } - - Object obj = property.getPropertyDescriptor().getReadMethod().invoke(from); if (null != obj && !obj.getClass().isAssignableFrom(type)) { return conversionService.convert(obj, type); } else {