When using the Hibernate3BeanReplicator with a class that has a java.util.Calendar object I get the error below. I've only included the first 50 lines of the 1025 lines generated. Any help would be appreciated.
Thanks,
Andrew
java.lang.StackOverflowError
at org.apache.log4j.CategoryKey.equals(CategoryKey.java:47)
at java.util.Hashtable.get(Unknown Source)
at org.apache.log4j.Hierarchy.getLogger(Hierarchy.java:268)
at org.apache.log4j.Hierarchy.getLogger(Hierarchy.java:242)
at org.apache.log4j.LogManager.getLogger(LogManager.java:188)
at org.apache.log4j.Logger.getLogger(Logger.java:117)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.<init>(ReplicatorTemplate.java:44)
at net.sf.beanlib.provider.BeanTransformer.<init>(BeanTransformer.java:185)
at net.sf.beanlib.provider.BeanPopulator.<init>(BeanPopulator.java:134)
at net.sf.beanlib.provider.BeanPopulator$Factory.newBeanPopulator(BeanPopulator.java:123)
at net.sf.beanlib.provider.BeanPopulator$Factory.newBeanPopulator(BeanPopulator.java:1)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.populateBean(ReplicatorTemplate.java:175)
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:196)
at net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator.replicateBean(Hibernate3JavaBeanReplicator.java:77)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicateByBeanReplicatable(ReplicatorTemplate.java:126)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:120)
at net.sf.beanlib.provider.BeanTransformer.transform(BeanTransformer.java:255)
at net.sf.beanlib.provider.BeanPopulator.doit(BeanPopulator.java:231)
at net.sf.beanlib.provider.BeanPopulator.processSetterMethod(BeanPopulator.java:185)
at net.sf.beanlib.provider.BeanPopulator.populate(BeanPopulator.java:325)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.populateBean(ReplicatorTemplate.java:179)
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:196)
at net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator.replicateBean(Hibernate3JavaBeanReplicator.java:77)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicateByBeanReplicatable(ReplicatorTemplate.java:126)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:120)
at net.sf.beanlib.provider.BeanTransformer.transform(BeanTransformer.java:255)
at net.sf.beanlib.provider.BeanPopulator.doit(BeanPopulator.java:231)
at net.sf.beanlib.provider.BeanPopulator.processSetterMethod(BeanPopulator.java:185)
at net.sf.beanlib.provider.BeanPopulator.populate(BeanPopulator.java:325)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.populateBean(ReplicatorTemplate.java:179)
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:196)
at net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator.replicateBean(Hibernate3JavaBeanReplicator.java:77)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicateByBeanReplicatable(ReplicatorTemplate.java:126)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:120)
at net.sf.beanlib.provider.BeanTransformer.transform(BeanTransformer.java:255)
at net.sf.beanlib.provider.BeanPopulator.doit(BeanPopulator.java:231)
at net.sf.beanlib.provider.BeanPopulator.processSetterMethod(BeanPopulator.java:185)
at net.sf.beanlib.provider.BeanPopulator.populate(BeanPopulator.java:325)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.populateBean(ReplicatorTemplate.java:179)
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:196)
at net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator.replicateBean(Hibernate3JavaBeanReplicator.java:77)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicateByBeanReplicatable(ReplicatorTemplate.java:126)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:120)
at net.sf.beanlib.provider.BeanTransformer.transform(BeanTransformer.java:255)
at net.sf.beanlib.provider.BeanPopulator.doit(BeanPopulator.java:231)
at net.sf.beanlib.provider.BeanPopulator.processSetterMethod(BeanPopulator.java:185)
at net.sf.beanlib.provider.BeanPopulator.populate(BeanPopulator.java:325)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.populateBean(ReplicatorTemplate.java:179)
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:196)
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
For now, you can use a custom transformer for Calendar objects, like so:
public class CalendarTransformer implements CustomBeanTransformerSpi {
public static class Factory implements CustomBeanTransformerSpi.Factory {
@Override
public CustomBeanTransformerSpi newCustomBeanTransformer(BeanTransformerSpi contextBeanTransformer) {
return new CalendarTransformer();
}
}
@Override
public <T> boolean isTransformable(Object from, Class<T> toClass, PropertyInfo propertyInfo) {
return from instanceof Calendar
&& Calendar.class.isAssignableFrom(toClass);
}
@Override
public <T> T transform(Object in, Class<T> toClass, PropertyInfo propertyInfo) {
Calendar cal = (Calendar)in;
return (T)cal.clone();
}
}
=====
Usages
=====
If you are replicating via Hibernate3BeanReplicator (for Hibernate objects), you can plug in this custom transformer like:
T from = ...
T to = new Hibernate3BeanReplicator()
.initCustomTransformerFactory(new CalendarTransformer.Factory())
.copy(from)
;
If you are replicating via BeanReplicator (for simple pojo's), you can plug in the same custom transform like:
T from = ...
T to = new BeanReplicator(new BeanTransformer(new CalendarTransformer.Factory())).replicateBean(from);
In the future, I will provide native support of Calendar in Beanlib.
Cheers,
Hanson
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
When using the Hibernate3BeanReplicator with a class that has a java.util.Calendar object I get the error below. I've only included the first 50 lines of the 1025 lines generated. Any help would be appreciated.
Thanks,
Andrew
java.lang.StackOverflowError
at org.apache.log4j.CategoryKey.equals(CategoryKey.java:47)
at java.util.Hashtable.get(Unknown Source)
at org.apache.log4j.Hierarchy.getLogger(Hierarchy.java:268)
at org.apache.log4j.Hierarchy.getLogger(Hierarchy.java:242)
at org.apache.log4j.LogManager.getLogger(LogManager.java:188)
at org.apache.log4j.Logger.getLogger(Logger.java:117)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.<init>(ReplicatorTemplate.java:44)
at net.sf.beanlib.provider.BeanTransformer.<init>(BeanTransformer.java:185)
at net.sf.beanlib.provider.BeanPopulator.<init>(BeanPopulator.java:134)
at net.sf.beanlib.provider.BeanPopulator$Factory.newBeanPopulator(BeanPopulator.java:123)
at net.sf.beanlib.provider.BeanPopulator$Factory.newBeanPopulator(BeanPopulator.java:1)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.populateBean(ReplicatorTemplate.java:175)
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:196)
at net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator.replicateBean(Hibernate3JavaBeanReplicator.java:77)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicateByBeanReplicatable(ReplicatorTemplate.java:126)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:120)
at net.sf.beanlib.provider.BeanTransformer.transform(BeanTransformer.java:255)
at net.sf.beanlib.provider.BeanPopulator.doit(BeanPopulator.java:231)
at net.sf.beanlib.provider.BeanPopulator.processSetterMethod(BeanPopulator.java:185)
at net.sf.beanlib.provider.BeanPopulator.populate(BeanPopulator.java:325)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.populateBean(ReplicatorTemplate.java:179)
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:196)
at net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator.replicateBean(Hibernate3JavaBeanReplicator.java:77)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicateByBeanReplicatable(ReplicatorTemplate.java:126)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:120)
at net.sf.beanlib.provider.BeanTransformer.transform(BeanTransformer.java:255)
at net.sf.beanlib.provider.BeanPopulator.doit(BeanPopulator.java:231)
at net.sf.beanlib.provider.BeanPopulator.processSetterMethod(BeanPopulator.java:185)
at net.sf.beanlib.provider.BeanPopulator.populate(BeanPopulator.java:325)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.populateBean(ReplicatorTemplate.java:179)
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:196)
at net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator.replicateBean(Hibernate3JavaBeanReplicator.java:77)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicateByBeanReplicatable(ReplicatorTemplate.java:126)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:120)
at net.sf.beanlib.provider.BeanTransformer.transform(BeanTransformer.java:255)
at net.sf.beanlib.provider.BeanPopulator.doit(BeanPopulator.java:231)
at net.sf.beanlib.provider.BeanPopulator.processSetterMethod(BeanPopulator.java:185)
at net.sf.beanlib.provider.BeanPopulator.populate(BeanPopulator.java:325)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.populateBean(ReplicatorTemplate.java:179)
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:196)
at net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator.replicateBean(Hibernate3JavaBeanReplicator.java:77)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicateByBeanReplicatable(ReplicatorTemplate.java:126)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:120)
at net.sf.beanlib.provider.BeanTransformer.transform(BeanTransformer.java:255)
at net.sf.beanlib.provider.BeanPopulator.doit(BeanPopulator.java:231)
at net.sf.beanlib.provider.BeanPopulator.processSetterMethod(BeanPopulator.java:185)
at net.sf.beanlib.provider.BeanPopulator.populate(BeanPopulator.java:325)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.populateBean(ReplicatorTemplate.java:179)
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:196)
Interesting, and thanks for reporting this.
For now, you can use a custom transformer for Calendar objects, like so:
public class CalendarTransformer implements CustomBeanTransformerSpi {
public static class Factory implements CustomBeanTransformerSpi.Factory {
@Override
public CustomBeanTransformerSpi newCustomBeanTransformer(BeanTransformerSpi contextBeanTransformer) {
return new CalendarTransformer();
}
}
@Override
public <T> boolean isTransformable(Object from, Class<T> toClass, PropertyInfo propertyInfo) {
return from instanceof Calendar
&& Calendar.class.isAssignableFrom(toClass);
}
@Override
public <T> T transform(Object in, Class<T> toClass, PropertyInfo propertyInfo) {
Calendar cal = (Calendar)in;
return (T)cal.clone();
}
}
=====
Usages
=====
If you are replicating via Hibernate3BeanReplicator (for Hibernate objects), you can plug in this custom transformer like:
T from = ...
T to = new Hibernate3BeanReplicator()
.initCustomTransformerFactory(new CalendarTransformer.Factory())
.copy(from)
;
If you are replicating via BeanReplicator (for simple pojo's), you can plug in the same custom transform like:
T from = ...
T to = new BeanReplicator(new BeanTransformer(new CalendarTransformer.Factory())).replicateBean(from);
In the future, I will provide native support of Calendar in Beanlib.
Cheers,
Hanson
That worked a treat. Thank you so much.
Andrew