2012-07-25 63 views
1

我在通过GWT中的RPC调用传输一个对象时出现问题。我在这个项目中使用Spring MVC和Hibernate。GWT-RPC传输Hibernate对象问题

这里是实体类:

@Entity 
public class Room implements Serializable{ 
    private static final long serialVersionUID = -5924198459524011627L; 

    private Long id; 
    private String name; 
    private String description; 

    private Set<Wall> walls = new HashSet<Wall>(0); 

    public Room(){ 
    } 

    public Room(String name, String description){ 
     this.name = name; 
     this.description = description; 
    } 

    public Room(String name, String description, Set<Wall> walls){ 
     this.name = name; 
     this.description = description; 
     this.walls = walls; 
    } 

    @Id 
    @Column(name = "ROOM_ID") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getDescription() { 
     return description; 
    } 
    public void setDescription(String description) { 
     this.description = description; 
    } 

    @ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinTable(name = "ROOM_WALL", joinColumns = {@JoinColumn(name = "ROOM_ID")}, 
      inverseJoinColumns = {@JoinColumn(name = "WALL_ID")}) 
    public Set<Wall> getWalls(){ 
     return walls; 
    } 

    public void setWalls(Set<Wall> walls){ 
     this.walls = walls; 
    } 
} 

这里是我的RoomDAO

@Repository 
public class RoomDAO { 

    @Autowired 
    private HibernateTemplate hibernate; 

    public Room get(Long id){ 
     return hibernate.get(Room.class, id); 
    } 

    public void delete(Room entity){ 
     hibernate.delete(entity); 
    } 

    public void save(Room entity){ 
     hibernate.saveOrUpdate(entity); 
    } 

    private Session getCurrentSession(){ 
     return hibernate.getSessionFactory().getCurrentSession(); 
    } 

    @SuppressWarnings("unchecked") 
    public List<Room> list(){ 
     String queryStr = "from "+Room.class.getSimpleName()+" fetch all properties"; 
     Query query = getCurrentSession().createQuery(queryStr); 
     System.out.println("Room list succesfull"); 
     return (List<Room>)query.list(); 
    } 

    @SuppressWarnings("unchecked") 
    public List<Wall> getWalls(Long id){ 
     String queryStr = "from "+Wall.class.getSimpleName()+" wl join wl.walls ls where ls.id=:"+id; 
     Query query = getCurrentSession().createQuery(queryStr); 
     System.out.println("Walls list succesfull"); 
     return (List<Wall>)query.list(); 
    } 
} 

这里是错误信息我获得:

com.google.gwt.user.client.rpc.SerializationException: Type 'org.hibernate.collection.PersistentSet' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = [] 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:619) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:153) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:539) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeClass(ServerSerializationStreamWriter.java:709) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:748) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:621) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:44) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serialize(ArrayList_CustomFieldSerializer.java:39) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.java:51) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.java:28) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:740) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:621) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:153) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:539) 
    at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:616) 
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:474) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:571) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:551) 
    at org.spring4gwt.server.SpringGwtRemoteServiceServlet.processCall(SpringGwtRemoteServiceServlet.java:37) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
    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:211) 
    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) 

我想问一下这个问题是由ManyToMany关系造成的,而设置为用来映射我实体之间的关系。因为当我传输一个没有任何关系的对象(ManyToMany或OneToMany等)时,我使用Set,RPC调用可以正常工作。

难道这是解决方案来取代设置列表?我知道列表是不是有效的数据库,但我不想重建整个项目:D

我发现这些问题可以通过使用推土机解决前。

非常感谢您的回答:)

回答

3

这是一个已知的问题。看一下这一章为什么当Hibernate对象在文章Using GWT with Hibernate到达浏览器世界时无法被理解。

+1

感谢您的回答:)我检查了可能的解决方案......最后我调整了服务器端的Hibernate对象,并将它们发送给客户端,但没有不可序列化的对象。所以我解决了无法在服务器端传输的逻辑:) – Reshi 2012-07-28 12:24:40