[weld-issues] [JBoss JIRA] (WELD-1131) Weld Proxies (for instance created by Producer-Method) loose Annotations put ontop of Methods of source class

Marko Lukša (JIRA) jira-events at lists.jboss.org
Thu May 10 11:24:18 EDT 2012


    [ https://issues.jboss.org/browse/WELD-1131?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12691906#comment-12691906 ] 

Marko Lukša commented on WELD-1131:
-----------------------------------

Yes, I've tested the version with {{Introspector.getBeanInfo(injectField.getClass())}}. If I change the weld version to 2.0.0.Alpha2 it works, and if I change it back to your original version, it doesn't. 

I've also stripped your example down to the bare minimum and created an arquillian test from it (see https://github.com/luksa/weld-core/commit/b991898647178d5cfebc3a6d237f386e06266520 )

The thing is, if you use reflection, you will (probably?) always need to know that there are proxies involved and handle them appropriately. 

Simply copying all the annotations to the proxy probably wouldn't solve all the problems. Imagine having an annotation on class A and on its subclass B. If we create a proxy for B, should we only copy annotations from B or also from A? If we copy only those from B, then you'd still have to know that the class you're dealing with is a proxy, and to get to annotations declared on A, you'd have to use bProxy.getSuperClass().getSuperClass().getAnnotations() (instead of simply b.getSuperClass().getAnnotations()).

Actually, I'm not sure how this is handled in Weld 2.0. 

                
> Weld Proxies (for instance created by Producer-Method) loose Annotations put ontop of Methods of source class
> -------------------------------------------------------------------------------------------------------------
>
>                 Key: WELD-1131
>                 URL: https://issues.jboss.org/browse/WELD-1131
>             Project: Weld
>          Issue Type: Bug
>          Components: Reflection layer
>    Affects Versions: 1.1.8.Final
>         Environment: glassfish 3.1.2
>            Reporter: P Huber
>            Assignee: Marko Lukša
>             Fix For: 2.0.0.Alpha2
>
>         Attachments: weld-forgets-annotation_WELD-1131.7z
>
>
> I have project specific Annotations ontop of public Methods of a class.
> class Customer {
>         @MyProjectSpecificAnnotation
> 	public String getFirstName() {
> 		return firstName;
> 	}
> }
> When producing Objects of such an annotated class, like with
> class Example {
>      @Produce
>      Customer producerField;
> }
> Then at the Injection Side the Annotations "MyProjectSpecificAnnotation" is no longer available, because WELD injects a byte-code created proxy.
> class InjectionSide {
>      @Inject
>      Customer injectField; // here we get the WELD-Proxy of unpronouncable name...and no Annotations
> }
> I've used BeanIntrospector to reflect the injected Instance of class Customer. I get a set of PropertyDescriptors with a write/read Method each.
> But as allready said, none of them has the "MyProjectSpecificAnnotation".
> Could be due to the fact, that when subclassing a class, the Annotations of the super class are not available at sub class directly - But in Case of a "transparent" WELD proxy I'd expect they should be there. Probably you have to simply copy annotations during on-the-fly byte-code creation of the Proxy. The Problem is btw also true for javas built in Dynamic Proxy: using it you also loose Annotations.
> Hope you can fix that

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

       



More information about the weld-issues mailing list