commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Niall Pemberton <niall.pember...@gmail.com>
Subject Re: [beanutils] beanutils library cannot invoke the correct accessor
Date Thu, 10 Jun 2010 14:30:30 GMT
On Mon, Jun 7, 2010 at 5:18 PM, Dimitris Tsitses <4.biz.etc@gmail.com> wrote:
> Hi James, thanks for keeping up with my questions.
>
> So, you mean end up with something like this: ?
>
> public class MyBean {
>       private ClassTypeA myProperty;
>       private ClassTypeB myPropertyAsB;
>       private ClassTypeC myPropertyAsC;
>       private ClassTypeD myPropertyAsD;
>
>       public void setMyProperty(ClassTypeA anObj) {
>               this.myProperty = anObj;
>       }
>       public void setMyPropertyAsB(ClassTypeB anObj) {
>               this.myProperty = Converter.convertBtoA(anObj);
>       }
>        .
>        .
>        .
> }
>
> Isn't this hacky as hell, just to compensate for beanutils' lack of basic functionality
(i.e., method overloading)? That looks really messy in my opinion, imagine doing that for
a number of properties in a few beans. I honestly don't understand why this functionality
is missing from beanutils. Anyhow, even if I wanted to do that, I could not in my use case.
It's a very dynamic environment where property names are computed automatically based on mappings
or field names in a DB. So I couldn't have multiple 'technical' property names for the same
'logical' property without butchering an otherwise very elegant design. I'd rather enhance
the beanutils library instead. So the question still stands, how would I go about it?

Hacky as hell is you overloading the accessor methods and will cause
you problems when using your java beans with any technology that
relies on the JavaBean specification - not just BeanUtils. I would
really recommend you avoid doing this.

Niall


> Henri, thanks a lot for the tip about JEXL2, I will look into it and see if it's less
work to replace beanutils with that library, instead of enhancing the beanutils library.
>
>
>
> On 2010-06-07, at 5:49 AM, James Carman wrote:
>
>> Why not have another "calculated" property ("myPropertyAsB") that can
>> do the translation from ClassTypeB to/from ClassTypeA and store it
>> into myProperty?  That way, you don't have to modify the library at
>> all?
>>
>> On Mon, Jun 7, 2010 at 12:04 AM, Dimitris Tsitses <4.biz.etc@gmail.com> wrote:
>>> Ok. I need some help to hack the library, where do I start. I want to make it
so that it checks the available setters against the objectType of the given argument, instead
of assuming an argument of a specific type. Example:
>>>
>>> BeanUtils.setProperty(myBeanInst, "myProperty", instanceOfClassTypeX);
>>>
>>> Algo: is there a setMyProperty in myBeanInst, accepting an argument of type ClassTypeX?
>>> YES: call it
>>> NO: throw exception
>>>
>>> Would appreciate it if someone could point me to the right direction for achieving
the above.
>>>
>>> Thanks
>>> Dimitris
>>>
>>>
>>> On 2010-06-06, at 8:24 PM, James Carman wrote:
>>>
>>>> The property consists of the getter/setter, not some field.  So, the
>>>> pair of matching setter/getter are what makes up the property.  The
>>>> overloaded method isn't a setter for the property.
>>>>
>>>> On Sun, Jun 6, 2010 at 12:55 PM, Dimitris Tsitses <4.biz.etc@gmail.com>
wrote:
>>>>> myProperty is of one type only. The overloaded setters are there only
for convenience, i.e., to convert to the type of myProperty before setting it. I don't think
the JavaBeans spec disallows that, if it did, that would mean that the JavaBeans spec undermines
Java's spec! (i.e., do you like method overloading? Well, you can't use it here!). That would
of course severally restrict JavaBeans usefulness.
>>>>>
>>>>>
>>>>> On 2010-06-06, at 5:50 AM, James Carman wrote:
>>>>>
>>>>>> That violates the JavaBeans specification.  "myProperty" is supposed
>>>>>> to be of one type only.
>>>>>>
>>>>>> On Sat, Jun 5, 2010 at 10:02 PM, Dimitris Tsitses <4.biz.etc@gmail.com>
wrote:
>>>>>>> Hi all, I'm trying to do something really simple but I can't
seem to figure it out, I hope someone can help.
>>>>>>>
>>>>>>> I have a simple bean:
>>>>>>>
>>>>>>>
>>>>>>> public class MyBean {
>>>>>>>        private ClassTypeA myProperty;
>>>>>>>
>>>>>>>        public void setMyProperty(ClassTypeA anObj) {
>>>>>>>                this.myProperty = anObj;
>>>>>>>        }
>>>>>>>        public void setMyProperty(ClassTypeB anObj) {
>>>>>>>                this.myProperty = Converter.convertBtoA(anObj);
>>>>>>>        }
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>> If I invoke the setter by passing an instance of ClassTypeA,
it works without a problem:
>>>>>>> BeanUtils.setProperty(myBeanInst, "myProperty", instanceOfClassTypeA);
>>>>>>>
>>>>>>>
>>>>>>> However if I invoke the setter by passing an instance of ClassTypeB,
I get an exception and the setter is never actually called:
>>>>>>> BeanUtils.setProperty(myBeanInst, "myProperty", instanceOfClassTypeB);
>>>>>>> java.lang.IllegalArgumentException: Cannot invoke.. la la la
- argument type mismatch -
>>>>>>>
>>>>>>> I can't believe it is not possible to do that, I'm sure I'm just
missing something. Any help will be greatly appreciated.
>>>>>>>
>>>>>>> Many thanks
>>>>>>> Dimitris
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
>>>>>> For additional commands, e-mail: user-help@commons.apache.org
>>>>>>
>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
>>>>> For additional commands, e-mail: user-help@commons.apache.org
>>>>>
>>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
>>>> For additional commands, e-mail: user-help@commons.apache.org
>>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
>>> For additional commands, e-mail: user-help@commons.apache.org
>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
>> For additional commands, e-mail: user-help@commons.apache.org
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
> For additional commands, e-mail: user-help@commons.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org


Mime
View raw message