ksoap2-android и массивы в запросе

в 0:39, , рубрики: android

Привет, %username%.

Возможно, всё это окажется очень тривиальным, но проблема стоила мне довольно долгого изучения документации, stackoverflow, стека вызовов и исходников ksoap2. Возможно, это сэкономит кому-то лишние пару часов.

Немножко сео: ksoap2 send array ArrayOfInt java.lang.StackOverflowError wsdl2ksoap скачать бесплатно торрент

Исходные условия: .NET WCF сервис и задача написать приложение для Android, с этим сервисом работающее.
Проблема: wsdl2ksoap прекрасно (насколько это возможно) сгенерировал все необходимые классы по WSDL-описанию SOAP-сервиса, и пока речь шла о простом взаимодействии типа «отправили циферку — получили какую-то структуру», всё шло великолепно. Конечно, кое-какие вещи пришлось подправить руками, и IntelliJ IDEA в этом очень помогла, но это мелочи.

Проблема появилась, когда на сервер нужно было отправлять массивы чисел, строк и enum'ов. Похоже, что ksoap2 просто не умеет нормально сериализовать объекты, унаследованные от сгенерированного wsdl2ksoap LiteralArrayVector, который, в свою очередь, всего-навсего Vector, реализующий интерфейс KvmSerializable. При попытке сериализации запроса всё валилось с java.lang.StackOverflowError, даже на простом ArrayOfInt (extends LiteralArrayVector).

В итоге, решение — всего лишь кастомный маршаллинг. Конечно немножко напряжно писать по маршаллеру на каждый тип ArrayOf<some_basic_type_or_enum>, но, похоже, это необходимое зло. Маршаллер, конечно, нужно зарегистрировать в сгенерированном классе, соответствующем сервису.

А вот и пример: pastebin.com/3P6s0P7J
soapUI даст вам хорошее представление о том, как должен выглядеть SOAP-запрос, который ожидает сервер, и, соответственно, поможет заменить int на нужный тип, будь то string, SOME_ENUM или что-то ещё.

Попутно хотелось бы дать совет начинающим разработчикам под Android: бросайте Eclipse и переходите на IntelliJ IDEA, в которой пацаны спокойно пишут классы, угорают по отличному быстрому UI и удобству работы. Только IDEA, только хардкор! :)

Автор: catsmile

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js