[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