【问题标题】:How to make a Map with cxf in groovy?如何在 groovy 中使用 cxf 制作地图?
【发布时间】:2012-08-07 20:18:13
【问题描述】:

GroovyWS 是一个在内部使用 CXF 的框架。我想提出如下要求:

<param2 xsi:type="ns2:Map">
    <item xsi:type="ns2:Map">
        <key xsi:type="xsd:string">param1</key>
        <value xsi:type="xsd:string">param2</value>
    </item>
</param2>

目前我正在尝试通过 grails 服务执行此操作,如下所示:

def proxy = new WSClient("http://xyz", this.class.classLoader)
proxy.initialize()

proxy.client.invoke("call", new HashMap<String, String>())

这给了

javax.xml.bind.JAXBException
class java.util.HashMap nor any of its super class is known to this context.

我什至尝试过 [:] 之类的东西,但没有成功。

【问题讨论】:

  • 我完全不记得细节,但是如果你尝试用proxy.client.objectFactory.createMap()创建地图参数呢? (最后一个方法的名称可能会有所不同,这取决于 WSDL 类型名称)

标签: grails soap groovy cxf groovyws


【解决方案1】:

好吧,我已经有一段时间没有做这样的事情了,但我似乎记得 CXF 生成的客户端有一个名为“create”的方法,类似于:

def mapObject = proxy.create( "ns2.Map" );

尝试一下,看看 mapObject 是否具有您所期望的方法或成员。

【讨论】:

  • 注意,我是从我的另一个答案中得到的:stackoverflow.com/questions/3317453/…
  • 我使用的 WSDL 没有ns2.Map。如何将其添加到响应中?
  • 我使用了 ns2.Map,因为这就是我在上面的 XML sn-p 中看到的。本质上,将命名空间视为此类事物的包,并将它们包含在您希望代理创建的类的名称中。
【解决方案2】:

这是一个known issue,使用JAXB

根本问题是您的架构不明确。

有两种解决方案:

  • 使用名称空间消除歧义
  • 将每个服务单独解析到不同的 Java 包中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 2017-03-09
    相关资源
    最近更新 更多