【问题标题】:Can I have Object type as a parameter of @WebMethod?我可以将对象类型作为@WebMethod 的参数吗?
【发布时间】:2010-07-07 00:49:53
【问题描述】:

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

有人回答说: “您只能传递 JAXB 支持的类型 Web 方法参数。 java.lang.Object 不能作为 web 方法参数传递。"

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

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

如果可以,我该怎么做?

【问题讨论】:

    标签: java jaxb jax-ws webmethod


    【解决方案1】:

    我不是一个巨大的 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);
    

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

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

    【讨论】:

    • 我明白了...这是一个面向客户的 Web 服务,所以我想我必须为每种类型的参数编写单独的 Web 方法。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-09
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 2016-11-17
      • 1970-01-01
      相关资源
      最近更新 更多