使用webservices将对象作为SOAP Request的一部分传递回来并将对象作为Response ....

时间:2008-10-18 05:18:26

标签: java web-services

我有一个web服务,它将java.lang.object对象作为参数(因为在运行时只知道hte类型的对象)...在完成进程后,回复响应设置java.lang.Object到它。

我能够从调用程序将reuest对象发送到webservice,但是在从webservice构建响应时获取NotSerializable异常。

我开始知道'如果我们实现java.io.serializable,那么mebmers也应该是可序列化的对象'......这里Object不是一个可序列化的对象..它不会驱使Serializable ....

如果有人能用正确的解决方案指导mw。我将感激不尽。

由于 巴斯卡尔

4 个答案:

答案 0 :(得分:3)

  

我有一个web服务,需要   java.lang.object对象作为参数   (因为在运行时只知道hte类型   对象)

这部分让我担心。编程时不知道类型是代码气味。如果您不知道它是什么,您如何制作代码来处理它?<​​/ p>

可能有合理的理由去做你想要完成的事情,但通常有更好的方法。这里真正的问题可能是:“我应该如何设计我的网络服务和代码,以满足我的要求?”

当一个方法接受“对象”或其他非常通用的类型时,它们通常包含一个类似开关的结构,它检查某些类型并以不同方式处理它们,而“未知”类型会抛出异常,或者(更糟)可能只是被忽略了。 这里的解决方案可能是为每种类型创建一个新方法。 如果它只是一种常用的Java方法,或者它是否是一个Web服务,那并不重要。

答案 1 :(得分:1)

将对象序列化为字节数组,并在SOAP调用中返回该对象,然后将该对象从客户端的字节数组中重新编组。 SOAP可以轻松有效地处理字节数组,而序列化将是SOAP事务范围之外的实现细节。

答案 2 :(得分:1)

要解决您的直接问题,您应该接受“Serializable”而不是“Object”。然后你需要让你的类可序列化。如果你不能这样做,你永远无法通过网络服务传输对象。

这是您必须了解的核心:如果可以通过Web服务传输,则意味着可以对其进行序列化。如果可以对其进行序列化,则可以将其设置为Serializable。

如果您无法修改类本身,则可以解决此问题。例如,您可以创建一个新的Serializable类,它可以从您的对象中读取所有相关信息。

要说Serializable类的所有成员都需要Serializable也不完全正确。所有需要的数据都需要可序列化,但类本身不需要实现Serializable接口。

另一种方法是实现这两种方法:

private void writeObject(java.io.ObjectOutputStream out) throws IOException;
private void readObject(java.io.ObjectInputStream in) throws IOException, classNotFoundException;

这里有一篇关于序列化的文章:Discover the secrets of the Java Serialization API

它描述了如何在“自定义默认协议”下使用这两种方法。

如果这还不够先进,请继续阅读“创建自己的协议:可外部化的接口”,了解如何实现Externalizable接口(Serializable的子接口),这使您可以完全控制序列化过程。

(我忽略了简单忽略非可序列化数据的“瞬态”功能,因为我假设您需要它们。如果我的假设是错误的,请阅读“非可序列化对象”部分。)

答案 3 :(得分:0)

如果类的成员没有实现Serializable,那么就不能使用本机Java序列化。这基本上就是你的错误信息告诉你的。

如果您不能使底层对象实现Serializable,那么您可能必须找到一种不同的序列化方法来传入和传出Web服务。来自Java的流行品种是XML,JSON,AMF,尽管你可以自己动手。

如果您的请求的任何一端都有Java对象,那么请确保您的代码因素,以便序列化和反序列化代码位于可以在两端使用的库中。这将大大减轻您的实施中的测试负担。

我建议将所有序列化代码保留在域对象本身之外。考虑使用工厂模式来创建对象。

HTH