我创建了一个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);
}
我不知道我错过了什么。
谢谢和最好的问候
答案 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;
}