Your Article class does not respect java beans specification.
public void setPerson(Person person) {
this.person = person;
}
// required for ibatis object construction
public void setPerson(PersonImpl person) {
this.person = person;
}
Having to setters with different argument produces an invalid bean and
java cannot find the setter.
In your case, you should have a second setter like this (only if the
first one doesn't work).
// required for ibatis object construction
public void setPersonImpl(PersonImpl person) {
this.person = person;
}
Then, update your sqlmap files.
Chris
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf
Of Larry Meadors
Sent: Tuesday, 11 July 2006 13:26
To: Paul Benedict
Cc: [email protected]
Subject: Re: interface property predicaments
Why does iBATIS need to know anything about the interface?
Larry
On 7/11/06, Paul Benedict <[EMAIL PROTECTED]> wrote:
> Larry, I am implementing an API. So this is the problem I have to deal
> with :-(
>
> The other guy is right. Ibatis thinks there is no setId on the Person
> because Person interface is read-only, although in the sqlmap I am
> constructing a PersonImpl on an ArticleImpl.
>
> I believe ibatis can be changed to solve this problem: Assuming that
> ibatis constructs inner objects as it navigates (does it?), it should
> use the instance it creates rather than looking at the type from the
getter.
>
> Otherwise I will have to have a diferent getter on my object just for
> ibatis that returns the impl.
>
> Paul
>
>
> Larry Meadors <[EMAIL PROTECTED]> wrote:
>
> So...I do not understand..your beans are interfaces?
>
> How often do you swap out the implementation of your beans? ;-)
>
> Larry
>
>
> On 7/10/06, Paul Benedict wrote:
> > I have two interfaces: Article and Person. My problem is with my
> > Article
> > implementation:
> >
> > public interface Article {
> > public Person getPerson();
> > }
> >
> > public class ArticleImpl extends Article { private Person person;
> > public Person getPerson() { return person; } public void
> > setPerson(Person person) { this.person = person; } // required for
> > ibatis object construction public void setPerson(PersonImpl person)
> > { this.person = person; } }
> >
> > I am using ibatis to construct it as follows:
> >
> >
> >
> >
> >
> > I get that annoying "cannot find WRITABLE property id in Person"
> > message because it is looks at Article.getPerson() which returns the
> > interface not implementation. But why should that matter? This is
> > wrong behavior, imo. I know ibatis constructs the inner object
> > first. It will create a
> PersonImpl,
> > set property "id" from column "person_id", and then call the setter
> > on Article.
> >
> > Otherwise, I am left believing ibatis cannot work with classes which
> > need
> to
> > implement a read-only interface..... or someone can recommend the
> solution,
> > which I might be unable to find?
> >
> > Paul
> >
> >
> > ________________________________
> > How low will we go? Check out Yahoo! Messenger's low PC-to-Phone
> > call
> rates.
> >
> >
>
>
>
>
> ________________________________
> Do you Yahoo!?
> Next-gen email? Have it all with the all-new Yahoo! Mail Beta.
>
>