beehive-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kyle Marvin (JIRA)" <beehive-...@incubator.apache.org>
Subject [jira] Commented: (BEEHIVE-149) Bean introspection fails for annotation-valued properties
Date Mon, 03 Jan 2005 19:23:50 GMT
     [ http://issues.apache.org/jira/browse/BEEHIVE-149?page=comments#action_57213 ]
     
Kyle Marvin commented on BEEHIVE-149:
-------------------------------------

Unfortunately, the fix isn't as simple as I'd like... Apparently, the java beans introspection
code *requires* that the arg type of the setter and the return type of the getter must match
up, or you'll get an exception like:

java.beans.IntrospectionException: type mismatch between read and write methods
        at java.beans.PropertyDescriptor.findPropertyType(PropertyDescriptor.java:603)
        at java.beans.PropertyDescriptor.setWriteMethod(PropertyDescriptor.java:270)
        at java.beans.PropertyDescriptor.<init>(PropertyDescriptor.java:117)

even if you explicitly give it the read/write methods in the PropertyDescriptor constructor.

The implication is that annotation type-valued property setters or getters must either a)
use a PropertyMap as both the return and set value types, or b) use the original annotation
type as the return and set value types.

I'm leaning towards b) because it provides better typed accessors (you just call the anotation
type member methods), at least for the property reading cases.   It also means standards dot-style
defering to access property values will work for annotation-typed properties, which seems
like a very key use case.

This means I'll also have to provide a mechanism to go from a PropertyMap to a typed proxy
instance, so setting an annotation valued property value would look something like:

         PropertyMap<AnnotType> propMap = new BeanPropertyMap<AnnotType>();
         propMap.setProperty(...);
         bean.setAnnotProperty(propMap.getProperty());

where PropertyMap.getProperty returns a PropertySetProxy instance that wraps the original
map.  Doing this cleanly also adds a need for using generic formal type parameters on the
PropertyMap interface and some of the associated impl classes.

> Bean introspection fails for annotation-valued properties
> ---------------------------------------------------------
>
>          Key: BEEHIVE-149
>          URL: http://issues.apache.org/jira/browse/BEEHIVE-149
>      Project: Beehive
>         Type: Bug
>   Components: Controls
>     Versions: V1Alpha
>     Reporter: Kyle Marvin
>     Assignee: Kyle Marvin
>     Priority: Minor
>      Fix For: V1Beta

>
> BeanInfo introspection of a Control type that has a property that is based upon a JSR-175
annotation type will fail w/ an Introspection exception.   The following is a sample exception,
based upon the org.apache.beehive.controls.test.controls.basic.Hello test control included
in the checkin tests:
> Caused by: java.beans.IntrospectionException: Method not found: setGender
>         at java.beans.PropertyDescriptor.<init>(PropertyDescriptor.java:93)
>         at java.beans.PropertyDescriptor.<init>(PropertyDescriptor.java:53)
>         at org.apache.beehive.controls.test.controls.basic.HelloBeanBeanInfo.initPropertyDescriptors(HelloBeanBeanInfo.java:137)
>         at org.apache.beehive.controls.test.controls.basic.HelloBeanBeanInfo.getPropertyDescriptors(HelloBeanBeanInfo.java:149)
>         at java.beans.Introspector.getTargetPropertyInfo(Introspector.java:475)
>         at java.beans.Introspector.getBeanInfo(Introspector.java:385)
>         at java.beans.Introspector.getBeanInfo(Introspector.java:155)
> The rub is that the java.beans.PropertyDescriptor class expects to find a method with
the following signature:
>         public void setGender(Gender gender);
> while bean exposes the following instead:
>         public void setGender(PropertyMap genderMap);
> This is because it is impossible to 'new' a JSR-175 annotation type and initialize its
values, so the PropertyMap interface (and the corresponsing concrete impl, BeanPropertyMap)
exists to abstract a collection of annotation type property values.  You can create a BeanPropertyMap,
push values into it, and then use it to set the (annotation-typed) property.
> The fix is to modify the BeanInfo codegen to use the java.beans.PropertyDescriptor constructor
that takes actual java.lang.reflect.Methods as arguments, to explicitly specify the specific
setter method on the bean class instead of allowing PropertyDescriptor to use the default
algorithm.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira


Mime
View raw message