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.
>
>

Reply via email to