2010-01-31 60 views
2

我有一个在jax-ws上实现的java的web服务。该Web服务返回用户的通用列表。它工作得很好:)。如何配置WebService以返回ArrayList而不是Array?

@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会生成数组而不是泛型列表'Group [] Groups'。我将'配置服务参考...'对话框中的'集合类型'更改为'System.Collections.Generic.List',但VS生成阵列:(。

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

回答

1

我建议不使用web服务的特定语言的结构,因为web服务,就是要语言无关。

如果你真的想,但你不应该你将不得不写具体的序列化器/反序列化器,你不能确定它将以所有语言工作。

我只会坚持到一个数组,然后用yo语言编写一个包装器。

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:complexType name="ArrayOfLineItem"> 
    <s:sequence> 
     <s:element minOccurs="0" maxOccurs="unbounded" name="LineItem" nillable="true" type="tns:LineItem" /> 
    </s:sequence> 
</s:complexType> 

当然并且,LineItem类本身在别处定义:

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

ArrayOfLineItem如定义。希望有帮助。

+0

感谢您的帮助,在.Net中,是的,Web服务生成类似于List和Collection样本的WSDL。但是我无法通过jaxb来创建这个WSDL,为了测试我编写了一个XSD文件并构建了这样的结构,不幸的是,这个方便的WSDL不会生成List。没问题,我的同事编写映射器将我们的DTO映射到我们想要的模型。这是一个很好的解决方法,但每次我有空闲时间再次测试你的想法。 – 2010-01-31 14:00:27

相关问题