Пару слов о том, как сгенерировать при помощи wsimport классы, реализующие Serializable интерфейс.

В статье дан пример создания совсем простого веб сервиса методом обратного проектирования. В качестве сервера приложений был взят jBoss 4.2. На этой тестовой площадке созданы четыре клиента: AXIS, JAX-WS (wsimport), Castor и простой парсер на XmlPullParser. Результаты скорости работы этих клиентов приведены в таблице. Статья включает в себя фрагменты исходного кода. Тестовые примеры доступны для скачивания.

Зачем все это

Появилась на днях потребность веб сервис сделать для приложения электронной коммерции. Задачи его тривиальны — показать пользователю товар по запросу и провести платеж кредитной карточкой. Но рассказ не об этом будет. А о том как получить классы из WSDL реализующие Serializable интерфейс.

В чем проблема

Естественным началом работы над таким проектом стало написание WSDL. Так получилось что при написании сервиса пришлось использовать уже готовые объекты, импортируя их XSD в новый WSDL. С одной стороны это значительно упростило работу, с другой стороны итоговое количество классов перевалило за тысячу.

Как бы то ни было WSDL готов и настало время генерировать объекты и интерфейсы.

Для этого мы воспользовались приложением wsimport из набора JDK(у нас была версию 6.2). Вот такой простой скрипт:

%JAVA_HOME%\bin\wsimport.exe service.wsdl -s src -d classes

Как видно из этой строчки исходные Java файлы будут положены в папку src, готовые классы в папку classes. Единственное — не забыть создать эти папки. Иначе получим ошибку.

После успешной генерации всех объектов и интерфейсов мы вдруг обнаружили отсутствие в них реализации Serializable интерфейса.

Решение

Наличие реализации Serializable интерфейса является обязательным в нашем случае, поэтому мы немедленно стали искать решение.

Как оказалось, простое добавление JAXB аннотации в нашем случае не сработало. Поэтому пришлось создать вот такой связной XML файл bind.xml:

 <?xml version="1.0" encoding="UTF-8"?>
 <jaxws:bindings wsdlLocation="hg.wsdl" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema [@targetNamespace='http://ws.mysite.com']">
   <jxb:globalBindings>
    <jxb:serializable/>
   </jxb:globalBindings>
  </jaxws:bindings>
 </jaxws:bindings> 

Здесь стоит обратить внимание на два параметра — wsdlLocation и targetNamespace. В значении первого прописываем адрес нашего WSDL файла. Можно указать URL адрес. В значении второго targetNamespace из нашего WSDL файла.

Затем таким образом изменяем стартовый скрипт:

%JAVA_HOME%\bin\wsimport.exe service.wsdl -s src -d classes -b bind.xml

Вот и все. В нашем распоряжении объекты, интерфейсы и файлы для серверной и клиентской части. Можно спокойно приступать к имплементации.

Александр Смелков
Санкт-Петербург Весна 2008