如何配置Web Service以返回ArrayList而不是Array?

时间:2010-01-31 11:20:16

标签: c# java wcf web-services jax-ws

我在java中有一个在jax-ws上实现的web服务。此Web服务返回User的通用列表。它的工作非常好:)。

@Stateless(name = "AdminToolSessionEJB")
@RemoteBinding(jndiBinding = "AdminToolSessionRemote")
@Remote(AdminToolSessionRemote.class)
@WebService
public class AdminToolSessionBean implements AdminToolSessionRemote {
...
@WebMethod(operationName = "GetAllUsers")
@WebResult(name = "AllUsers")
public List<User> getAllUsers() {
    return userSessionRemote.getAllUsers();
}
...
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "User")
public class User extends BasicDataTransferObject {
...
@XmlElement(name = "Groups")
private List<Group> groups;
...
}

但我会在.Net应用程序中使用此Web服务。当我在VS2005或VS2008或VS2010中将此Web服务添加为wcf服务或Web服务时,VS生成数组而不是od通用列表'Group [] Groups'。我将“配置服务引用...”对话框中的“集合类型”更改为“System.Collections.Generic.List”,但VS生成数组:(。

我需要VS生成通用列表或ArrayList,我应该怎么做?

2 个答案:

答案 0 :(得分:2)

我不确定如何在java中定义它。但是,在我的C#服务中,我的主要交易参数(采购订单)包含如下定义的订单项列表:

private LineItems LineItemsField;
[DataMember(Order=13, EmitDefaultValue=false)]
public LineItems LineItems {
    get { return this.LineItemsField; }
    set { this.LineItemsField = value; }
}

LineItems是另一个C#类,定义如下:

[CollectionDataContract(Namespace="")]
public class LineItems : List<LineItem>
{
}

LineItem是包含订单项字段的实际类。

LineItems在WSDL中显示为:

<s:element minOccurs="0" maxOccurs="1" name="LineItems" type="tns:ArrayOfLineItem" />

ArrayOfLineItem定义为:

<s:complexType name="ArrayOfLineItem">
    <s:sequence>
        <s:element minOccurs="0" maxOccurs="unbounded" name="LineItem" nillable="true" type="tns:LineItem" />
    </s:sequence>
</s:complexType>

当然,LineItem类本身也在其他地方定义。希望这会有所帮助。

答案 1 :(得分:1)

我建议不要在Web服务中使用特定于语言的构造,因为Web服务意味着与语言无关。

如果你真的想要,但你不应该写一个特定的序列化器/反序列化器,你无法确定它是否适用于所有语言。

我只想坚持一个数组然后用你选择的yo语言写一个包装器。