3

我尝试创建一个具有 java.lang.Object 参数的 Web 方法,但收到类似于以下内容的错误:http: //community.jboss.org/message/532500

一个人回答说:“你只能传递 JAXB 支持的类型 web 方法参数。java.lang.Object 不能作为 web 方法参数传递。”

事实上,当我将参数类型更改为 Object 以外的其他类型时,它起作用了。

如果我不能将 Object 作为 Web 方法参数传递,这背后的原因是什么?当我想通过单个 Web 方法传递各种对象类型时如何处理?

如果可以,我该怎么做?

4

2 回答 2

2

我不是一个巨大的 JAXB/JAX-WS 人,但是:他可能是对的。

我们在内部为此使用的一种模式——因为当您通过 Web 服务边界发送对象时,您基本上是将它们扁平化为仅用 WS-I 配置文件的词汇表可以表达的东西——是手动序列化任何对象您正在尝试通过调用者和服务理解的枚举发送并为反序列化过程提供一些上下文。

在以下简单示例中,DemuxEnum将是一个枚举,其中包含您要发送的所有类型的值:

MyObject obj = new MyObject();
ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
ObjectOutputStream objectOut = new ObjectOutputStream(byteOutStream);       
objectOut.writeObject(obj);
objectOut.close();

byte[] serializedObject= byteOutStream.toByteArray();
someWSObject.SendObject(DemuxEnum.MyObjectType, serializedObject);

您已经设置了一个 Web 服务端点,该端点采用(DemuxEnum, byte[]). 对于奖励积分,您可以使用替代的序列化器/反序列化器技术,如Apache ThriftGoogle ProtocolBuffers

编辑:这样做的明显缺点是,如果它是面向客户的 Web 服务,那将无法运行。如果是这种情况,您可能最好枚举具有具体参数的 Web 方法。

于 2010-07-07T01:21:28.340 回答
2

一个更好的方法是使用 JAXB 作为他收到的另一个帖子的答案中概述的 OP - 请参阅此处: http: //myarch.com/create-jax-ws-service-in-5-minutes .

于 2011-07-20T06:44:49.103 回答