【问题标题】:Describing a string array in a wsdl file在 wsdl 文件中描述字符串数组
【发布时间】:2012-05-16 00:48:50
【问题描述】:

我正在为一个项目使用 globus 工具包。在我的服务中,我有一个资源:一个字符串数组。我想从 Android 客户端获取此资源。我怎样才能做到这一点?如何在 wsdl 文件中描述“字符串数组”类型? 谢谢。

【问题讨论】:

    标签: java wsdl globus-toolkit


    【解决方案1】:

    我猜你正在寻找这个

    <complexType name='ArrayOfString'>
        <sequence>
            <element name='item' type='xsd:string' maxOccurs='unbounded'/>
        </sequence>
    </complexType>
    

    来源:http://www.activebpel.org/samples/samples-2/BPEL_Samples/Resources/Docs/arrays.html

    更新:

    我使用 NetBeans 7.0.1 进行了测试。结果是这样的:

    声明一个接收String[]参数的方法:

    @WebMethod(operationName = "helloArray")
    public String helloArray(@WebParam(name = "name") String[] name) {
        StringBuilder sb = new StringBuilder("Hello ");
        if (name != null) {
            for(int i = 0; i < name.length; i++) {
                sb.append(name[i]);
                if (i < (name.length - 1)) {
                    sb.append(" and ");
                }
            }
        }
        sb.append('!');
        return sb.toString();
    }
    

    WSDL 使用字符串数组元素为我的方法生成了一个复杂类型

    <xs:complexType name="helloArray">
        <xs:sequence>
            <xs:element name="name" type="xs:string" nillable="true" minOccurs="0" 
                maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    

    在客户端,IDE 生成了一个List&lt;String&gt; 来使用它:

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "helloArray", propOrder = {"name"})
    public class HelloArray {
    
        @XmlElement(nillable = true)
        protected List<String> name;
    
        public List<String> getName() {
            if (name == null) {
                name = new ArrayList<String>();
            }
            return this.name;
        }
    }
    

    以及使用服务的方法

    private String helloArray(java.util.List<java.lang.String> name) {
        edu.home.wsclient.HelloWorldWS port = service.getHelloWorldWSPort();
        return port.helloArray(name);
    }
    

    我已经上传了两个项目in this address

    【讨论】:

    • 谢谢。现在,当我从客户端获得响应时,作为通用 Java 对象,我尝试将其转换为 (String []),我得到一个 ClassCastException。
    • 我在验证 wsdl 时也遇到异常:ArrayOfString is referenced but not defined!
    • 这是在 WSDL 中还是在 XSD 文件中?
    • 当我在响应中调用 getClass() 方法时,它返回给我 java.lang.String。我想知道为什么!
    【解决方案2】:

    您可以使用具有多重性 > 1 的 String 元素(以及更多数据,如果您愿意)的自定义类型。

    <xsd:sequence>
      <xsd:element name="YourClass" type="pre:YourClass" maxOccurs="unbounded" minOccurs="0">
      </xsd:element>
    </xsd:sequence>
    

    【讨论】:

    • 如何转换响应返回的对象?如果我尝试使用 (String []) 我得到一个 ClassCastException。
    【解决方案3】:

    让 XML 调用具有多个子级的父标记,每个子级都有一个来自数组的字符串值:

    <parent>
        <child>String 1</child>
        <child>String 2</child>
    </parent>
    

    适当地命名标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 2012-04-20
      • 1970-01-01
      相关资源
      最近更新 更多