Codename One - Web服务不支持可外部化对象

时间:2017-06-06 14:08:58

标签: java web-services codenameone externalizable

我创建了一个CN1 Web服务,我想要外部化一些自定义对象,以便通过网络发送。我阅读了几篇关于如何创建Web服务以及如何使用CN1 Externalizable接口的文章。

这适用于返回自定义外部化对象的Web服务方法,但是我唯一的指标是将可外部化对象作为参数的方法,我收到以下错误:

SCHWERWIEGEND: Servlet.service() for servlet  [CN1WebServiceServlet] 
in context with path [/<myPath>] threw exception
java.io.IOException: Object type not supported: Post

该对象已在Util类中正确注册,因为更改对象ID或注释掉寄存器调用将导致空指针而不是IO异常。

Post类看起来像这样(简化到已经失败的最小值):

public class Post implements Externalizable {
public int postid;
public int userid;

// default constructor needed for web service marshalling
public Post() {

}

@Override
public int getVersion() {
    return 1;
}

@Override
public void externalize(DataOutputStream out) throws IOException {
    Util.writeUTF("" + postid, out);
    Util.writeUTF("" + userid, out);
}

@Override
public void internalize(int version, DataInputStream in) throws IOException {
    this.postid = Integer.parseInt(Util.readUTF(in));
    this.userid = Integer.parseInt(Util.readUTF(in));
}

@Override
public String getObjectId() {
    return "Post";
}

请注意,当我调用返回post对象的Web服务方法时,此Post对象可以正常工作,但是当我将Post对象发送到Web服务时则不行:

// works
public static com.codename1.io.Externalizable getPostDetails(int postid) {
   return getPostDetails(postid);
}

// fails
public static void sendPost(com.codename1.io.Externalizable post) {
    sendPost(post);
}

我不知道我错过了什么。

谢谢和最好的问候

2 个答案:

答案 0 :(得分:1)

在Servlet代码中调用Util.register("Post", Post.class);,希望能解决这个问题。

答案 1 :(得分:0)

非常感谢Shai!我的错误是假设只在一侧注册可外部化的对象。但是当然它需要在内部化的任何地方进行注册,所以在我的服务器上就是这种情况。

解决方案: 在“CN1WebServiceServlet”(不是必须完成其余代码的ProxyServer类)中,调用Util.register(“Post”,Post.class);

      if(methodName.equals("sendPost")) {
            Util.register("Post", Post.class); // this is a my insertedline, rest is generated
            Object[] args = ProxyServerHelper.readMethodArguments(di, def_sendPost);
            WebServiceProxyServer.sendPost((com.codename1.io.Externalizable)args[0]);
            ProxyServerHelper.writeResponse(response, def_sendPost);
            return;
        }
相关问题