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: user-java@ibatis.apache.org 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. > >