Hi Edson
Edson Carlos Ericksson Richter wrote:
> Hi!
>
> Interesting that the error doesn't occur when attribute is ArrayList and
> set/get works with Collection (let's see: ArrayList is an instance of
> Collection, so... this works).
>
> But if I have a setter method that work with items (setMyCollection( int
> index, MySecondBean bean) ) - stop working.
>
> AFAIK (and I'm making extensible use of OJB), using ArrayList for Set/Get
> Collections is fine. The problem is with settter that work with individual
> items (that causes NullPointerException). Appear that OJB is not reconizing
> signature (or is just looking for a method setMyCollection( ArrayList ) -
> not for superclasses (Collection, in this case) ).
This is not an OJB problem! If you have a look at
PersistentFieldPropertyImpl you will see that it uses standard java
beans stuff to obtain getters and setters:
private transient java.beans.PropertyDescriptor propertyDescriptor;
Method m = getPropertyDescriptor().getWriteMethod();
and
Method m = getPropertyDescriptor().getReadMethod();
AFAICT your code does collide with java beans stuff not with something
OJB specific.
If you don't want to change your code I recommend to use the
PersistentFieldDefaultImpl that uses Java reflection instead of Java
beans compliant field access.
cheers,
Thomas
>
> Excuse-me if phrases above has too much parentesis, I can't avoid... ;-)
>
> Thanks by your tips... I'll try to work with ArrayList always (as suggested
> by S.Thompson)...
>
>
> Edson Richter
>
> ----- Original Message -----
> From: "Thomas Mahler" <[EMAIL PROTECTED]>
> To: "OJB Users List" <[EMAIL PROTECTED]>
> Sent: Tuesday, October 08, 2002 2:32 PM
> Subject: Re: Trouble with Getter/Setter - using 0.9.7 and olders!
>
>
>
>>Hi,
>>
>>The problem IMO is that the attribute
>>private ArrayList myCollection
>>and the getter
>>public Collection getMyCollection( )
>>and the setter
>>public void setMyCollection( Collection myNewCollection )
>>do not form a Java beans compliant attribute/getter/setter trio, as they
>>are of different types.
>>Java will not be able to detect them as matching !
>>
>>you can:
>>1. fix this by using proper typing
>>2. define a BeanInfo class that declares which methods are to be used
>>for accessing the myCollection attribute
>>3. tell OJB to not use Java beans compliant calls to access attributes
>>but use direct reflection access. You can do so by setting the
>>PersistentField Implementation class in OJB.properties.
>>
>>cheers,
>>Thomas
>>
>>Edson Carlos Ericksson Richter wrote:
>>
>>>Hi!
>>>This is a very long e-mail. Excuse-me sending as is, but is the only way
>>
> to
>
>>>explain this bug.
>>>
>>>I think I already reported this issue, but since today I had some
>>
> extended
>
>>>tests, I'll report results:
>>>
>>>1) I've created a bean called MyFirstBean with properties
>>>
>>>public class MyFirstBean implements Serializable {
>>> private int beanId;
>>> private String beanName;
>>> private ArrayList myCollection = new ArrayList( );
>>>
>>> public void setBeanId( int newBeanId ) {
>>> beanId = newBeanId;
>>> }
>>> public int getBeanId( ) {
>>> return beanId;
>>> }
>>> public void setBeanName( String newBeanName ) {
>>> beanName = newBeanName;
>>> }
>>> public String getBeanName( ) {
>>> return beanName;
>>> }
>>> public void setMyCollection( int index, MySecondBean bean ) {
>>> if( index > myCollection.size( ) )
>>> myCollection.add( bean );
>>> else
>>> myCollection.set( index, bean );
>>> }
>>> public MySecondBean getMyCollection( int index ) {
>>> return ( MySecondBean )myCollection.get( index );
>>> }
>>> public Collection getMyCollection( ) {
>>> return myCollection;
>>> }
>>> public void setMyCollection( Collection myNewCollection ) {
>>> myCollection.clear( );
>>> myCollection.addAll( myNewCollection );
>>> }
>>>}
>>>
>>>Ok, define the main class (MySecondBean no makes difference here), and
>>>creating a repository.xml that makes relationships between two tables to
>>>work by a collection descriptor, if I maintain the method
>>
> setMyCollection
>
>>>(int, bean), I get (mail continues after stacktrace):
>>>
>>>java.lang.NullPointerException
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.retrieveCollection(Unkn
>
>>>own Source)
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.retrieveCollections(Unk
>
>>>nown Source)
>>> at
>>>
>>
> org.apache.ojb.broker.accesslayer.RsIterator.getObjectFromResultSet(Unknown
>
>>>Source)
>>>[org.apache.ojb.broker.ta.PersistenceBrokerFactoryDefaultImpl] INFO:
>>
> Already
>
>>>created persistence broker instances: 1
>>>[ConfigurableFactory] INFO: ConfigurableFactory called to serve a class
>>>org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl instance
>>>[ConfigurableFactory] INFO: ConfigurableFactory called to serve a class
>>>org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl instance
>>>[ConfigurableFactory] INFO: ConfigurableFactory called to serve a class
>>>org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl instance
>>>[ConfigurableFactory] INFO: ConfigurableFactory called to serve a class
>>>org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl instance
>>>[ConfigurableFactory] INFO: ConfigurableFactory called to serve a class
>>>org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl instance
>>> at org.apache.ojb.broker.accesslayer.RsIterator.next(Unknown
>>
> Source)
>
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Un
>
>>>known Source)
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Un
>
>>>known Source)
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Un
>
>>>known Source)[org.apache.ojb.broker.accesslayer.RsIterator] ERROR: null
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Un
>
>>>known Source)
>>> at
>>>
>>
> br.com.everest.composer.persistence.TestePersistente.<init>(TestePersistente
>
>>>.java:39)
>>> at
>>>
>>
> br.com.everest.composer.persistence.TestePersistente.main(TestePersistente.j
>
>>>ava:63)
>>>java.lang.NullPointerException
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.retrieveCollection(Unkn
>
>>>own Source)
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.retrieveCollections(Unk
>
>>>nown Source)
>>> at
>>>
>>
> org.apache.ojb.broker.accesslayer.RsIterator.getObjectFromResultSet(Unknown
>
>>>Source)
>>> at org.apache.ojb.broker.accesslayer.RsIterator.next(Unknown
>>
> Source)
>
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Un
>
>>>known Source)
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Un
>
>>>known Source)
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Un
>
>>>known Source)
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Un
>
>>>known Source)Erro: null
>>> at
>>>
>>
> br.com.everest.composer.persistence.TestePersistente.<init>(TestePersistente
>
>>>.java:39)
>>> at
>>>
>>
> br.com.everest.composer.persistence.TestePersistente.main(TestePersistente.j
>
>>>ava:63)
>>>java.util.NoSuchElementException
>>> at org.apache.ojb.broker.accesslayer.RsIterator.next(Unknown
>>
> Source)
>
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Un
>
>>>known Source)
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Un
>
>>>known Source)
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Un
>
>>>known Source)
>>> at
>>>
>>
> org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Un
>
>>>known Source)
>>> at
>>>
>>
> br.com.everest.composer.persistence.TestePersistente.<init>(TestePersistente
>
>>>.java:39)
>>> at
>>>
>>
> br.com.everest.composer.persistence.TestePersistente.main(TestePersistente.j
>
>>>ava:63)
>>>
>>>
>>>and, if I remove this method, maintaining only setMyCollection
>>
> (Collection),
>
>>>all works fine.
>>>
>>>Since the bean is correct (and compatible) with JavaBean spec, someone
>>
> can
>
>>>fix this? I really tryied to do this, but OJB is above my compreension
>>
> (I
>
>>>don't have domain over XML/Reflections APIs - and I get lost in OJB
>>>sources).
>>>
>>>Thanks,
>>>
>>>Edson Richter
>>>
>>>
>>>
>>>---
>>>Email foi verificado quanto a exist�ncia de virus antes de seu envio, e
>>
> n�o
>
>>>h� virus.
>>>Checked by AVG anti-virus system (http://www.grisoft.com).
>>>Version: 6.0.394 / Virus Database: 224 - Release Date: 03/10/2002
>>>
>>>
>>>
>>>--
>>>To unsubscribe, e-mail:
>>
> <mailto:[EMAIL PROTECTED]>
>
>>>For additional commands, e-mail:
>>
> <mailto:[EMAIL PROTECTED]>
>
>>>
>>>
>>>
>>
>>
>>--
>>To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
>>For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>>
>>
>
>
> ---
> Email foi verificado quanto a exist�ncia de virus antes de seu envio, e n�o
> h� virus.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.394 / Virus Database: 224 - Release Date: 03/10/2002
>
>
>
> --
> To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>
>
>
>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>