diff --git a/magnolia-core/src/main/java/info/magnolia/jcr/node2bean/TransformedBy.java b/magnolia-core/src/main/java/info/magnolia/jcr/node2bean/TransformedBy.java index 47ef2f5..6b8f697 100644 --- a/magnolia-core/src/main/java/info/magnolia/jcr/node2bean/TransformedBy.java +++ b/magnolia-core/src/main/java/info/magnolia/jcr/node2bean/TransformedBy.java @@ -44,7 +44,7 @@ import java.lang.annotation.Target; * set by Node2Bean. */ @Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) +@Target({ElementType.METHOD, ElementType.TYPE, ElementType.ANNOTATION_TYPE}) public @interface TransformedBy { Class value(); } diff --git a/magnolia-core/src/main/java/info/magnolia/jcr/node2bean/impl/TypeMappingImpl.java b/magnolia-core/src/main/java/info/magnolia/jcr/node2bean/impl/TypeMappingImpl.java index d923f4d..f828f79 100644 --- a/magnolia-core/src/main/java/info/magnolia/jcr/node2bean/impl/TypeMappingImpl.java +++ b/magnolia-core/src/main/java/info/magnolia/jcr/node2bean/impl/TypeMappingImpl.java @@ -42,6 +42,8 @@ import info.magnolia.jcr.node2bean.TypeMapping; import info.magnolia.objectfactory.Components; import java.beans.PropertyDescriptor; +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -93,10 +95,12 @@ public class TypeMappingImpl implements TypeMapping { } // set write method dscr.setWriteMethod(writeMethod); + // set add method + if (propertyType!=null) { int numberOfParameters = dscr.isMap() ? 2 : 1; dscr.setAddMethod(getAddMethod(beanClass, propName, numberOfParameters)); - + } break; } } @@ -164,9 +168,17 @@ public class TypeMappingImpl implements TypeMapping { Class transformerClass = null; Node2BeanTransformer transformer = null; if (writeMethod != null) { - TransformedBy transformerAnnotation = writeMethod.getAnnotation(TransformedBy.class); - transformerClass = transformerAnnotation == null ? null : (Class) transformerAnnotation.value(); - transformer = transformerClass == null ? null : Components.getComponentProvider().newInstance(transformerClass); + transformer = getTransformerFromAnnotation(writeMethod); + } + if (transformer == null) { + transformer = getTransformerFromAnnotation(beanClass); + } + if (transformer == null) { + // if no @TransformedBy on class, look at the other annotations of that class to see if they are themselves annotated with that. + final Annotation[] annotations = beanClass.getAnnotations(); + for (Annotation annotation : annotations) { + transformer = getTransformerFromAnnotation(annotation.annotationType()); + } } if (transformer == null) { try { @@ -176,11 +188,18 @@ public class TypeMappingImpl implements TypeMapping { log.debug("No transformer found for bean [{}]", beanClass); } } + return transformer; } return null; } + protected Node2BeanTransformer getTransformerFromAnnotation(AnnotatedElement writeMethod) { + final TransformedBy transformerAnnotation = writeMethod.getAnnotation(TransformedBy.class); + final Class transformerClass = transformerAnnotation == null ? null : (Class) transformerAnnotation.value(); + return transformerClass == null ? null : Components.getComponentProvider().newInstance(transformerClass); + } + /** * Gets type descriptor from bean class. */