Как настроить WebService для возврата ArrayList вместо Array? - PullRequest
2 голосов
/ 31 января 2010

У меня есть веб-сервис на Java, который реализован на jax-ws. Этот веб-сервис возвращает общий список пользователей. Работает очень хорошо :).

@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 Applications. Когда я добавляю этот веб-сервис в качестве службы wcf или веб-службы в VS2005, VS2008 или VS2010, VS генерирует массив вместо общего списка 'Group [] Groups'. Я изменяю «Тип коллекции» в диалоговом окне «Справочник службы конфигурации ...» на «System.Collections.Generic.List», но VS создает массив: (.

Мне нужно, чтобы VS генерировал общий список или ArrayList, что мне следует делать?

Ответы [ 2 ]

2 голосов
/ 31 января 2010

Я не уверен, как определить это в 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 голос
/ 31 января 2010

Я бы порекомендовал не использовать языковые конструкции в веб-сервисе, так как веб-сервис не зависит от языка.

Если вы действительно хотите, но не должны, вам придется написать определенный сериализатор / десериализатор, в котором вы не можете быть уверены, что он будет работать на всех языках.

Я бы просто привязался к массиву, а затем написал бы оболочку на выбранном вами языке.

...