Hello,
I have a problem to receive BaseTreeModel instances (GWT-Ext (GXT) object from Ext-JS) from server side in GWT when created by Hibernate engine, I get this error message :
Code:
[ERROR] 28/12/2009 09:36:18 [btpool0-2] [BeanPopulator]
propertyName=properties
readerMethod=public java.util.Map com.extjs.gxt.ui.client.data.BaseModelData.getProperties()
setterMethod=public void com.extjs.gxt.ui.client.data.BaseModelData.setProperties(java.util.Map)
fromBean=1
toBean=1
java.lang.ClassCastException
at java.lang.Class.cast(Class.java:2990)
at net.sf.beanlib.provider.replicator.CollectionReplicator.replicateCollection(CollectionReplicator.java:127)
at net.sf.beanlib.hibernate3.Hibernate3CollectionReplicator.replicateCollection(Hibernate3CollectionReplicator.java:79)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:109)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:71)
at net.sf.beanlib.hibernate3.Hibernate3MapReplicator.replicate(Hibernate3MapReplicator.java:83)
at net.sf.beanlib.provider.replicator.MapReplicator.replicateMap(MapReplicator.java:152)
at net.sf.beanlib.hibernate3.Hibernate3MapReplicator.replicateMap(Hibernate3MapReplicator.java:67)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:118)
at net.sf.beanlib.provider.BeanTransformer.transform(BeanTransformer.java:231)
at net.sf.beanlib.provider.BeanPopulator.doit(BeanPopulator.java:201)
at net.sf.beanlib.provider.BeanPopulator.processSetterMethod(BeanPopulator.java:172)
at net.sf.beanlib.provider.BeanPopulator.populate(BeanPopulator.java:269)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.populateBean(ReplicatorTemplate.java:190)
at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicator.java:187)
at net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator.replicateBean(Hibernate3JavaBeanReplicator.java:71)
at net.sf.gilead.core.beanlib.clone.CloneClassBeanReplicator.replicateBean(CloneClassBeanReplicator.java:129)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicateByBeanReplicatable(ReplicatorTemplate.java:140)
at net.sf.beanlib.provider.replicator.ReplicatorTemplate.replicate(ReplicatorTemplate.java:135)
at net.sf.beanlib.provider.BeanTransformer.transform(BeanTransformer.java:231)
at net.sf.beanlib.hibernate.HibernateBeanReplicator.copy(HibernateBeanReplicator.java:134)
at net.sf.gilead.core.LazyKiller.clone(LazyKiller.java:237)
at net.sf.gilead.core.LazyKiller.detach(LazyKiller.java:191)
at net.sf.gilead.core.PersistentBeanManager.clonePojo(PersistentBeanManager.java:376)
at net.sf.gilead.core.PersistentBeanManager.clone(PersistentBeanManager.java:248)
at net.sf.gilead.gwt.GileadRPCHelper.parseReturnValue(GileadRPCHelper.java:126)
at net.sf.gilead.gwt.PersistentRemoteService.processCall(PersistentRemoteService.java:153)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
Here the server side code :
Code:
public Project createProject(Project project) {
HttpServletRequest request = this.getThreadLocalRequest();
this.session = request.getSession();
project.setUserCreated((User) this.session.getAttribute("user"));
project.setDateCreated(new Date());
setObject(project, false);
return project;
}
private Object setObject(Object object, boolean update) {
Session session = null;
Transaction transaction = null;
try {
session = HibernateContext.getSessionFactory().openSession();
transaction = session.beginTransaction();
if (update)
session.update(object);
else session.save(object);
transaction.commit();
}
catch (RuntimeException e) {
_log.fatal(e.getMessage());
transaction.rollback();
throw e;
}
finally {
if (session != null)
session.close();
}
return object;
}
And the client side code :
Code:
Project project = new Project();
project.setTitle(textTitle.getValue());
project.setDescription(textDescription.getValue().replaceAll("\n", "<br />"));
project.setDevelopers(new HashSet<User>(listDevelopers.getToList().getStore().getModels()));
project.setScrumMaster(comboScrumMaster.getValue());
project.setProductOwner(comboProductOwner.getValue());
ServicesAsync services = Services.Util.getInstance();
services.createProject(project, new AsyncCallback<Project>() {
public void onSuccess(Project arg0) {
hide();
((ProjectPage) Global.currentPage).addPortlet(new ProjectPortlet(project));
Info.display(textTitle.getValue(), "Le projet a été créé avec succès !");
}
public void onFailure(Throwable arg0) {
MessageBox.alert("Erreur", "Impossible de créer le projet !", null);
}
});
And the model definition in Java :
Code:
package scrum.domain;
import java.io.Serializable;
import java.util.Date;
import java.util.Set;
import com.extjs.gxt.ui.client.data.BaseModelData;
public class Project extends BaseModelData implements Serializable {
private static final long serialVersionUID = 5958356423644996087L;
public Project() {
super();
}
public Project(Project project) {
setProperties(project.getProperties());
}
public Integer getId() {
return get("id");
}
public void setId(Integer id) {
set("id", id);
}
public String getTitle() {
return get("title");
}
public void setTitle(String title) {
set("title", title);
}
public String getDescription() {
return get("description");
}
public void setDescription(String description) {
set("description", description);
}
public Set<User> getDevelopers() {
return get("developers");
}
public void setDevelopers(Set<User> developers) {
set("developers", developers);
}
public User getScrumMaster() {
return get("scrumMaster");
}
public void setScrumMaster(User scrumMaster) {
set("scrumMaster", scrumMaster);
}
public User getProductOwner() {
return get("productOwner");
}
public void setProductOwner(User productOwner) {
set("productOwner", productOwner);
}
public User getUserCreated() {
return get("userCreated");
}
public void setUserCreated(User userCreated) {
set("userCreated", userCreated);
}
public Date getDateCreated() {
return get("dateCreated");
}
public void setDateCreated(Date dateCreated) {
set("dateCreated", dateCreated);
}
public User getUserModified() {
return get("userModified");
}
public void setUserModified(User userModified) {
set("userModified", userModified);
}
public Date getDateModified() {
return get("dateModified");
}
public void setDateModified(Date dateModified) {
set("dateModified", dateModified);
}
@Override
public String toString() {
return get("title");
}
}
And finally the model definition for Hibernate :
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="scrum.domain.Project" table="project">
<id name="id" type="integer">
<column name="id" />
<generator class="native" />
</id>
<property name="title" type="string">
<column name="title" length="64" not-null="true" unique="true" />
</property>
<property name="description" type="text">
<column name="description" not-null="false" />
</property>
<set name="developers" table="project_user">
<key column="project_id" />
<many-to-many class="scrum.domain.User" column="user_id" />
</set>
<many-to-one name="scrumMaster" column="scrum_master" class="scrum.domain.User" not-null="false" />
<many-to-one name="productOwner" column="product_owner" class="scrum.domain.User" not-null="false" />
<many-to-one name="userCreated" column="user_created" class="scrum.domain.User" not-null="true" />
<property name="dateCreated" type="timestamp">
<column name="date_created" not-null="true" />
</property>
<many-to-one name="userModified" column="user_modified" class="scrum.domain.User" not-null="false" />
<property name="dateModified" type="timestamp">
<column name="date_modified" not-null="false" />
</property>
</class>
</hibernate-mapping>
Anyone does have seen this before ?
Thanks for any help.
All the best.