2011-10-07 5 views
1

GWT 2.4를 사용하고 있습니다. 직렬화 문제가 있습니다. 내 서비스는 방법이 있습니다 ... 다음과 같이 내 "노드"클래스가 정의되어있는GWT : 직렬화 오류로 인해 당황했습니다

@RemoteServiceRelativePath("retrieveChild") 
public interface ChildRetrievalService extends RemoteService { 
    ... 
    Collection<Node> getRootNodes(); 

...

public class Node implements Serializable { 

    private Long id; 
    private Node parent; 
    private String info; 
    private List<Node> children; 

    public Node() { 
     this.children = new ArrayList<Node>(); 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } // setId 

    public Node getParent() { 
     return parent; 
    } 

    public void setParent(Node parent) { 
     this.parent = parent; 
    } 

    public String getInfo() { 
     return info; 
    } 

    public void setInfo(String info) { 
     this.info = info; 
    } // setInfo 

    public List<Node> getChildren() { 
     return children; 
    } 

    public boolean equals(Object node) { 
     return node != null && 
      node instanceof Node && 
      ((Node) node).getId() == id; 
    } 

    public int hashCode() { 
     return getId().hashCode(); 
    } 

} 

하지만 서비스 메소드 (method)를 불러들이려고 오류를 받고 있어요 , 직렬화에 대해 불평. HashMap과 Node 모두 직렬화 가능하므로 모든 것이 무너집니다.

[WARN] Exception while dispatching incoming RPC call 

com.google.gwt.user.client.rpc.SerializationException : 유형 'java.util.HashMap에 $의 값은'이 SerializationPolicy 또는 Class 객체 직렬화 할 수있는 유형의 집합에 포함되지 않았다 로드 할 수 없습니다. 보안을 위해이 유형은 serialize되지 않습니다. instance = [[email protected], [email protected], [email protected] , [email protected], [email protected]] 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.RPC.encodeResponse (RPC. java : 616) com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess (RPC.java:474)에서 (com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse (RPC.java : 571) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall (RemoteServiceServlet.java:208) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost (RemoteServiceServlet.java:248) com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost (AbstractRemoteServiceServlet.java:62) javax.servlet.http.HttpServlet.service에서 (HttpServlet.java:637)부터는 javax.servlet.http에서 에서 . HttpServlet.service (HttpServlet.java:717) at org.mortbay.jetty.servlet.ServletHolder.handle (ServletHolder.java:487) at org.mortbay.jetty.servlet.Servl orgHandler.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:50) 5) org.mortbay.jetty.HttpConnection $ RequestHandler.content (HttpConnection.java:843) org.mortbay.jetty.HttpParser에서 org.mortbay.jetty.HttpParser.parseNext (HttpParser.java:647) 에서 에서 . 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.자바 : 488)

감사합니다, - 데이브

+1

구체적인 유형의 Collection을 RemoteService 인터페이스에 넣으려고합니다. 때로는 GWT가 허용 목록에 포함되지 않는 것에 대해 엉뚱한 것을 얻을 수 있습니다. –

답변

2

당신은 GWT RPC하는 방법 매개 변수에 대한 추상적 인 유형 (또는 인터페이스)를 사용할 수 없습니다 :

은 현재 GWT RPC 시스템을 기반으로 구체적인 유형의 직렬화를 중심으로. 일반적으로 동일한 구체 유형은 이어야 클라이언트와 서버에서 모두 사용할 수 있습니다. 사용자 지정 serializer를 사용하여 클라이언트 또는 서버에서 사용되는 실제 형식을 변경할 수 있지만 serialize 된 형식에는 serializer에 대한 정보가 있어야합니다. RPC 인터페이스가 이 임의로 많은 (추상) 유형을 사용하여 선언 된 경우 문제가 발생합니다.

자세한 내용은 here을 참조하십시오.

RPC 메커니즘이 실제로 무엇이 될지 모르기 때문에 매개 변수를 직렬화 할 수 없다는 사실에 귀결됩니다. 또는 가능한 모든 구체적인 구현을 직렬화하는 방법은 실용적이지 않습니다. 따라서 당신은 당신의 필요에 가장 적합한 구체적인 수업을 선택해야합니다.

1

항상 RPC에서 사용되는 데이터에 구체적인 유형을 사용하십시오. GWT 컴파일러는 모든 하위 클래스에 대한 구현을 생성해야하기 때문에 서버에서 어떤 하위 유형을 보낼지 알지 못합니다. 이는 오버 헤드가 많이 발생하는 유형이나 인터페이스가 있음을 의미 할 수 있습니다. 사용되지 않는 많은 유형이 추가되었습니다. 예를 들어 List가 지정된 경우 ArrayList 만 사용한다는 것을 알 수 있습니다.

이 오류는 serialize 할 수없는 substype을 추가하려고하기 때문에 발생할 수 있습니다.

관련 문제