You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2013/01/05 18:27:43 UTC
svn commit: r1429331 -
/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java
Author: struberg
Date: Sat Jan 5 17:27:43 2013
New Revision: 1429331
URL: http://svn.apache.org/viewvc?rev=1429331&view=rev
Log:
OWB-745 the order of @Inject field definition matters
@Inject fields of superclasses must get injected before subclasses
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java?rev=1429331&r1=1429330&r2=1429331&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java Sat Jan 5 17:27:43 2013
@@ -337,13 +337,44 @@ public final class WebBeansAnnotatedType
}
}
- public <X> void defineInjectedFields(AbstractInjectionTargetBean<X> bean,AnnotatedType<X> annotatedType)
+ public <X> void defineInjectedFields(AbstractInjectionTargetBean<X> bean, AnnotatedType<X> annotatedType)
{
+ // we start with the actual class and it will define the fields from the uppermost
+ // base class down to this very class
+ defineInjectedFields(bean, annotatedType, annotatedType.getJavaClass());
+ }
+
+ /**
+ * The @Inject fields must be defined in a specific order. Fields in a Superclass must get defined
+ * before the fields in the Subclasses.
+ *
+ * @param bean which should get filled
+ * @param annotatedType to get the annotation information from
+ * @param targetClass the current class which should get introspected. Only fields from this very class will get defined.
+ */
+ private <X> void defineInjectedFields(AbstractInjectionTargetBean<X> bean, AnnotatedType<X> annotatedType, Class<?> targetClass)
+ {
+ if (targetClass.equals(Object.class))
+ {
+ return;
+ }
+
+ // we first recurse to the top level superclass
+ Class<?> superclass = targetClass.getSuperclass();
+ defineInjectedFields(bean, annotatedType, superclass);
+
+ // and start our field definition in the uppermost non-Object class :)
+
AnnotationManager annotationManager = bean.getWebBeansContext().getAnnotationManager();
Set<AnnotatedField<? super X>> annotatedFields = annotatedType.getFields();
for(AnnotatedField<? super X> annotatedField: annotatedFields)
{
+ if (!targetClass.equals(annotatedField.getJavaMember().getDeclaringClass()))
+ {
+ // only scan fields of the current targetClass
+ continue;
+ }
if(Modifier.isPublic(annotatedField.getJavaMember().getModifiers()) && !annotatedField.isStatic())
{
if(webBeansContext.getBeanManagerImpl().isNormalScope(bean.getScope()))