Category Archives: Spring WS

Spring WS difficulties or lack of documentation

В этот раз история будет о неожидонных сложностях, возникшых с одним из замечательных модулей Spring, а именно Spring WS.

На проекте возникла необходимость написания WebService с нуля, было решено использовать Spring и стандартные технологии  в качестве связующей платформы в пользу проприетарных BEA, а теперь уже Oracle принадлежащих решениях. В частности для слоя работы с базой данных мы решили использовать JPA, а в качестве провайдера OpenJPA, до этоо в компании использовалось DSP, честно, первый раз услышал, разбираться не стали. Для WebService стека соответственно Spring WS, вместо чистого JAX WS со связкой через EJB, DAO и BO слои, вы можете сказать, что JAX WS это тоже стандарт, да не могу с вами не согласиться, но Spring WS находится на грани между стандартами и предоставляет гибкость при использовани разных технологий.

В общем после выбора технологий мы принялись за реализацию, и тут нас настигли небольшие трудности… Spring WS навязывает использование подхода – сначала XML потом Java код, это объясняется необхоимостью обеспечения портированности. Это достигается за счет того, что вы продумываете используемые типы данных в WebService и при генерации кода, можно получить не только для языка, с которым вы работаете, но и для любого другого, либо с вашим WebService сможет работать лубой другой клиент, написанный на любом языке.

Так же одной из еще возникших непонятностей, это возвращаемые и принимаемые на вход аргументы и их типы. Как оказалось после дебага в течении итеративных правок кода, сборки, деплоя на WebLogic, и запуском SOATest на запущенном в режиме отладки WebService, было выяснено, что WSDL, предложенный нам архитекторами не совместим с подходом Spring WS. В частности по привычке работы с JAX WS, методы WebService принимали несколько аргументов как примитивных, так и комплексных типов, что так же было присуще и возвращаемым типам данных. По-началу мысли были в стороне приведения типов аргументов и возвращаемых значений к примитивным, но этот фокус не удался. После дальнейшего “дебага” мы наконец-то поняли – Spring WS поддерживает в качестве аргумента только комплексный тип, описанный в XML, при чем аргумент должен быть один. Ну и возвращаемый тип значения тоже должен быть комплексным и описанным в XML. Таким образом если вы возвращаете значение примитивного типа, то вам нужно обвернуть его в комплексный тип и задекларировать в XML (WSDL или XSD).

После приведенных выше правок, наш WebService закрутился на ура, оставалось соглавсовать наши правки в WSDL с архитекторами.

На первый взгляд упомянутые выше ограничения не логичны, но если поразмыслить, то все становится на свои места. Делая обвертки для множества аргументов и примитивных типов возвращаемых значений в виде комплексного типа, мы увеличиваем уровень абстракции и инкапсуляции WebService.

На этом пожалуй мое повествование можно считать завершенным.

Всем удачи и ожидаемых ожиданий 😉