Hi Kadir, Do you have a small unit test. If you have one, it will be easier to review your classes. I would like to review it maybe it is a bug in the OCM code.
Thanks, Christophe 2009/9/13 Kadir Alaca <[email protected]>: > Hi, > > i have an interface IMyImage and its implementation in MyImageImpl. > MyImageImpl has @Bean-Fields which refer to the interface IMyResource. > IMyResource is implemented in MyResourceImpl. > > But here the related code: > > > @Node(isInterface=true, jcrType="my:bag", discriminator=false) > public interface IMyBag { > //getter and setter defs for path, uuid and other > } > > @Node(isInterface=true, jcrType="my:image", extend=IMyBag.class, > discriminator=false) > public interface IMyImage extends IMyBag { > IMyResource getImage(); > void setImage(IMyResource resource); > //... > } > > @Node(isInterface=true, jcrType="my:resource", discriminator=false) > public interface IMyResource { > InputStream getData(); > void setData(InputStream data); > //... > } > > @Node(jcrType="my:bagimpl", isAbstract=false, discriminator=false) > @Implement(interfaceName=IMyBag.class) > public class MyBagImpl implements IMyBag { > @Field(path = true) > private String path; > > @Field(uuid=true) > private String UUID; > //... > } > > @Node(jcrType="my:imageimpl", extend=MyBagImpl.class, discriminator=false) > @Implement(interfaceName=IMyImage.class) > public class MyImageImpl extends MyBagImpl implements IMyImage { > @Bean(jcrName="my:image", proxy=true, > converter=DefaultBeanConverterImpl.class) > protected IMyResource image; > > public IMyResource getImage() { > return image; > } > > public void setImage(IMyResource image) { > this.image = image; > } > //... > } > > @Node(jcrType="my:resourceimpl", isAbstract=false, discriminator=false) > @Implement(interfaceName=IMyResource.class) > public class MyResourceImpl implements IMyResource { > > @Field(jcrName="my:binarydata") > protected byte[] binarydata; > > public byte[] getBinarydata() { > return binarydata; > } > > public void setBinarydata(byte[] binarystream) { > this.binarydata = binarystream; > } > > public InputStream getData() { > return new ByteArrayInputStream(this.binarydata); > } > > public void setData(InputStream data) { > this.binarydata = FileUtils.toByteArray(data); > } > //... > } > > > > > > When i insert such an image, OCM works pretty fine. > Applying an update on that inserted image results to the following > exception: > > Repository access exception; nested exception is > org.apache.jackrabbit.ocm.exception.IncorrectPersistentClassException: Class > of type: java.lang.Object has no descriptor. > org.springmodules.jcr.JcrSystemException: Repository access exception; > nested exception is > org.apache.jackrabbit.ocm.exception.IncorrectPersistentClassException: Class > of type: java.lang.Object has no descriptor. > > I have debugged OCM and found that > > public static Class getBeanClass(Object bean) > { > Class beanClass = bean.getClass(); > if (isProxy(beanClass)) > { > //CGLIB specific > return beanClass.getSuperclass(); > } > return beanClass; > } > > in org.apache.jackrabbit.ocm.reflection.ReflectionUtils returns > java.lang.Object > for the field > protected IMyResource image; > > The return value is used in ObjectConverterImpl to retrieve the > ClassDescriptor for the Bean: > ClassDescriptor classDescriptor = > mapper.getClassDescriptorByClass(ReflectionUtils.getBeanClass(object)); > > Of course there is no descriptor for java.lang.Object. > > When i implement the same structure with concrete classes, OCM works fine. > > The relevant technology-stack: > + jackrabbit 1.6.0 with ocm 1.5.3 > + spring 2.5.6 > + springmodules 0.9 - with patch from > http://jira.springframework.org/browse/MOD-446 > + tomcat 6.0.18 > + cglib > > > > How can i improve my code or maybe OCM self to get done the update-thing > with interfaces? > > Any advice is welcome. > > Thanks in advance, > Kadir. > >
