Возврат ArrayList из WebService в Java - PullRequest
10 голосов
/ 07 июля 2011

У меня проблема с возвратом ArrayList из моего веб-сервиса (Java).

Я написал тестовый веб-сервис и клиент, который его использует. Кажется, что все работает нормально - это то, что клиент вызывает сервер, а сервер получает запрос операции.

Однако я написал простой метод, который я хочу, чтобы он возвращал ArrayList.

У меня есть определение интерфейса следующим образом:

@WebService
@SOAPBinding(style = Style.RPC)
public interface ISQLServerConnectionWS {

    @WebMethod
    ArrayList getSimpleArrayList();
}

У меня есть серверная реализация для возврата ArrayList:

@WebService(endpointInterface="WebServices.ISQLServerConnectionWS")
public class SQLConnectionWSServer
    implements ISQLServerConnectionWS {

    @Override
    public ArrayList getSimpleArrayList() {
        ArrayList al = new ArrayList();
        al.add( "This" );
        al.add( "is" );
        al.add( "a" );
        al.add( "test" );
        return al;
    }
}

И, наконец, мой клиент позвонил ему:

ArrayList results = server.getSimpleArrayList();

Сервер хорошо заполняет список массивов. Однако на стороне клиента ArrayList пуст. Имеет размер 0.

Если я проверю WSDL по моему URL (http://127.0.0.1:9876/myservice-sql?wsdl) для executeSelectSQL, он будет выглядеть так:

<message name="executeSelectSQLResponse">
    <part name="return" type="tns:arrayList"/>
</message>

Я что-то упускаю из виду?

Edit:

Однако, если у меня есть веб-метод, определяется в интерфейсе как:

@WebMethod
String getAString();

и реализация сервера:

@Override
public String getAString() {
    return "hello there";
}

тогда это работает нормально - "hello there" получено на клиенте.

Ответы [ 2 ]

12 голосов
/ 07 июля 2011

Используйте массив вместо ArrayList, поскольку JAXB не может обрабатывать коллекции как объекты верхнего уровня, только как свойства bean-компонентов.Или создайте bean-компонент и поместите в него ArrayList.

См. Ошибку: JAXB-223: JAXB не поддерживает классы коллекций как объекты верхнего уровня

3 голосов
/ 07 июля 2011

Я предлагаю создать отдельный класс pojo, где объявляем переменную

private ArrayList ListData;

, создаем метод setter / getter и используем класс POJO в вашем основном классе для установки массива.В то же время Операция getSimpleArrayList меняет тип возвращаемого значения на тип POJO.Соответственно измените и файл wsdl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...