[weld-dev] Potentially un-spec'd behavior for BeanManager.createAnnotatedType(...)

Pete Muir pmuir at redhat.com
Thu May 6 09:07:25 EDT 2010


I think this needs clarification in the spec *create*AnnotatedType suggests that the AnnotatedType should be created from the class passed, not fetched from the modified one if the class is the same as the passed.

But I think the behavior should be that it uses the modified one.

On 5 May 2010, at 22:16, Lincoln Baxter, III wrote:

> Hey Guys,
> 
> I'm working on an extension that @Observes ProcessAnnotatedType in order to modify the typing information for fields annotated with a specific Annotation.
> 
> When I use BeanManager to later construct an instance of AnnotatedType for that modified class, however, I am not supplied with the modified AnnotatedType instance, I am given a brand new instance that does not include my extension's prior modifications.
> 
> If this is right, then there needs to be some way to retrieve the previously modified data from the BeanManager, otherwise, the information is effectively lost unless the BeanManager is creating a full contextual instance of the class, not merely providing injection.
> 
> So this doesn't seem right to me. Thoughts?
> 
> Example code below.
> Thanks,
> Lincoln
> 
> --------------------------------------------------------------------------------------------------------
>    public <T> void processAnnotatedType(@Observes final ProcessAnnotatedType<T> event)
>    {
>       AnnotatedTypeBuilder<T> builder = AnnotatedTypeBuilder.newInstance(event.getAnnotatedType());
>       builder.readAnnotationsFromUnderlyingType();
>       boolean modifiedType = false;
> 
>       for (AnnotatedField<?> f : event.getAnnotatedType().getFields())
>       {
>          if (f.isAnnotationPresent(InputField.class))
>          {
>             builder.overrideFieldType(f.getJavaMember(), Object.class);
>             modifiedType = true;
>          }
>       }
> 
>       if (modifiedType)
>       {
>          AnnotatedType<T> replacement = builder.create();
>          event.setAnnotatedType(replacement);
>       }
>    }
> 
> 
> Then later... the AnnotatedType created in the method below not reflect changes made to the type in the extension above.
> 
>    public void injectNonContextualInstance(final Object instance)
>    {
>       if (instance != null)
>       {
>          CreationalContext<Object> creationalContext = manager.createCreationalContext(null);
>          InjectionTarget<Object> injectionTarget = (InjectionTarget<Object>) manager.createInjectionTarget(beanManager.createAnnotatedType(instance.getClass()));
>          injectionTarget.inject(instance, creationalContext);
>       }
>    }
> 
> 
> 
> -- 
> Lincoln Baxter, III
> http://ocpsoft.com
> http://scrumshark.com
> "Keep it Simple"
> _______________________________________________
> weld-dev mailing list
> weld-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/weld-dev




More information about the weld-dev mailing list