【问题标题】:How to use HashMap as a parameter in Web serviceWeb服务中如何使用HashMap作为参数
【发布时间】:2012-11-06 21:32:47
【问题描述】:

我正在尝试创建一个动态 Web 服务,我将在其中期待一个 Java 哈希映射或一个数组列表作为参数。

我在类代码中使用以下代码:

package demo;

import java.util.ArrayList;

import javax.jws.WebService;

@WebService
public class HashMapTest {
    public HashMapTest() {
        super();
    }

    public int getResponse(ArrayList<String> hm) {
        return hm.size();
    }
}

我正在使用 IDE:Oracle Jdeveloper 11g。当我同样使用向导时,输出 WSDL 如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<wsdl:definitions
     name="HashMapTestService"
     targetNamespace="http://demo/"
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
     xmlns:tns="http://demo/"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
     xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
    >
    <wsdl:types>
    </wsdl:types>
    <wsdl:portType name="HashMapTest">
    </wsdl:portType>
    <wsdl:binding name="HashMapTestSoapHttp" type="tns:HashMapTest">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    </wsdl:binding>
    <wsdl:service name="HashMapTestService">
        <wsdl:port name="HashMapTestPort" binding="tns:HashMapTestSoapHttp">
            <soap:address location="http://localhost:7101/DemoServer-Demo-context-root/HashMapTestPort"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

显而易见,WSDL 已损坏且无法使用。

这只是 Jdeveloper 中的一个错误,还是我们可以不使用 Web 服务中的 Collections API 作为参数?

请帮忙

【问题讨论】:

标签: java web-services collections wsdl jdeveloper


【解决方案1】:

这是由 JAXB 中的错误引起的。使用以下代码:

public class DTOObject
{ 
        HashMap hm = new HashMap();

    public void setHm(HashMap hm) {
        this.hm = hm;
    }

    public HashMap getHm() {
        return hm;
    }

    public int size() {
        return hm.size();
    }
}

public class HashMapTest {
    public HashMapTest() {
        super();
    }

    public int getResponse(Wrapped hm) {

        System.out.println(hm);
        return hm.size();
    }


}

它将解决问题并正确创建 wsdl。

【讨论】:

    【解决方案2】:

    您不能在 Web 服务中使用技术相关类型。您应该使用 String 或 Byte 。 如果要将集合作为参数传递,则将其序列化并以字节的形式将其作为参数传递。在另一端创建集合表单字节的实例。

    【讨论】:

    • 你说得对,不应该在 WS 接口上使用具体的实现。但是你当然可以在 WS 中使用地图语义!
    • 亲爱的 Vijay,我找到了一个解决方案,我会回答同样的问题。但事实是,技术特定库通过使用 JAXB 映射的编组转换为 XML。 @Anders Rostgaard Bystrup 的回答是正确的,因为 JAXB 似乎存在问题。无论如何。请注意,复杂对象也用于 Web 服务。
    • 是的,您可以在 web 服务中使用特定于技术的类型,但这会使您的 web 服务技术依赖。
    • 完全没有,如果您使用现代 IDE,它们将创建相同的类似实现。并且几乎所有技术都有相同的集合类,但名称不同或相同,所以这应该不是什么大问题。
    • 好的,这意味着如果存在任何依赖于技术的类型,那么它将在 wsdl 中定义为复杂类型,并且使用简单类型进行定义。这就是 XSD 中发生的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多