Поради та прийоми роботи з інструментарієм розробки Web-сервісів IBM Rational Application Developer.: Частина 1. Не забувайте про сторінку налаштування параметрів, Різне, Програмування, статті

Введення


Інструментарій розробки Web-сервісів

IBM Rational Application Developer являє собою повнофункціональне засіб швидкої розробки додатків на базі Eclipse. Він дозволяє вам (розробнику ПО) проектувати, створювати, розгортати, тестувати і публікувати програми, засновані на концепції Web-сервісів. Використання цього інструментарію суттєво спрощує та автоматизує процес розробки функціонально сумісних Web-сервісів, відповідних специфікації WS-I, одночасно підвищуючи його ефективність.


Rational Application Developer має багаті можливості по розробці Web-сервісів. Можливо, з деякими з них вам ще тільки належить познайомитися. Даний цикл статей, заснований на питаннях, що задаються користувачами-розробниками, розповість вам про деякі прийоми і дасть корисні поради, які допоможуть вам при розробці Web-сервісів за допомогою Rational Application Developer версії 6 і 7.


Перша стаття циклу познайомить вас з виключно корисною сторінкою налаштування параметрів Web-сервісів, що надають великий вплив на процес розробки. Можливо, ви поки не знаходили часу для того, щоб розібратися з цими параметрами, але, повірте, справа того варта!


Почнемо з Rational Application Developer 6. Rational Application Developer 7 має ряд розширених можливостей, про які я розповім трохи пізніше.


За замовчуванням у щойно створеному проекті Rational Application Developer 6 підтримка Web-сервісів відключена. Щоб її включити, виконайте команду Window > Preferences > Workbench > Capabilities, Включіть всі опції в гілці Web Service Developer, Як показано на малюнку 1, після чого натисніть кнопку OK.


Рисунок 1. Включення підтримки Web-сервісів
Cписок опцій підтримки Web-сервісів з описами

Налаштування IBM WebSphere


Після того як ви включите підтримку Web-сервісів, з’явиться сторінка налаштування параметрів Web-сервісів. Я не буду розповідати про всі можливі налаштуваннях. Замість цього я докладно зупинюся на тих, що знаходяться в гілці Web Services> Code Generation> IBM WebSphere runtime (малюнок 2).


Рисунок 2. Налаштування IBM WebSphere
Список опцій, детально описуються далі

Disable data binding and use SOAPElement


Ця можливість вкрай корисна при роботі з типами даних JAX (Java ™ API for XML)-RPC для яких відсутня підтримка. Ми повернемося до обговорення цієї можливості в розділі Нові можливості Rational Application Developer 7 в кінці статті. Залишимо найцікавіше наостанок.


Do not overwrite loadable Java Classes


Допоміжні JAR (Java ™ Archive) – файли часто використовуються для включення в додаток Java ™ 2 Platform, Enterprise Edition (J2EE ™) існуючого коду, що реалізує допоміжні функції, що полегшує його використання в декількох проектах без змін. Проте якщо ви плануєте розробляти Web-сервіси на основі існуючого коду, вам, можливо, доведеться зіткнутися з деякими складнощами. Генерація коду Web-сервісу на основі наявної програми відбувається наступним чином.



  1. Спочатку ви генеруєте WSDL-файл на основі існуючого Java-коду (Java2WSDL).
  2. Потім на основі отриманого WSDL-файл ви генеруєте (WSDL2Java) файли, складові Web-сервіс (допоміжні Java-класи, дескриптори розгортання і т.д.)

Якщо ви використовуєте допоміжні JAR-файли, можливо збіг імен згенерованих Java-класів з іменами класів в інших проектах, модулях або JAR-файлах. Це може привести до виникнення помилок при компіляції, оскільки згенеровані класи та сигнатури їхніх методів можуть не збігатися з тими, що знаходяться в ваших допоміжних JAR-файлах.


Помилки компіляції, характерні для даного випадку, супроводжуються наступними повідомленнями:



Якщо ви використовуєте у вашому проекті допоміжні JAR-файли або бібліотеки сторонніх виробників, має сенс включити цю опцію щоб уникнути збігу імен класів.


Generate Java from WSDL using the no wrapped style


Дана опція еквівалентна аргументу WSDL2Java -noWrappedOperations. Вона включає режим ігнорування обгортання операцій. Якщо ця опція включена, то для повідомлень запиту та відповіді будуть створені компоненти Java Beans. За замовчуванням ця опція вимкнена і WSDL2Java буде розгортати загорнуті операції.


Приклад WSDL приведений в лістингу 1.


Лістинг 1. Приклад WSDL





<complexType name=”Address”>
<sequence>
<element name=”province” nillable=”true” type=”xsd:string”/>
<element name=”city” nillable=”true” type=”xsd:string”/>
<element name=”street” nillable=”true” type=”xsd:string”/>
<element name=”postalCode” nillable=”true” type=”xsd:string”/>
<element name=”phoneNumber” nillable=”true” type=”xsd:int”/>
</sequence>
</complexType>
<element name=”findAddress”>
<complexType>
<sequence>
<element name=”name” nillable=”true” type=”xsd:string”/>
</sequence>
</complexType>
</element>
<element name=”findAddressResponse”>
<complexType>
<sequence>
<element name=”findAddressReturn” nillable=”true” type=”impl:Address”/>
</sequence>
</complexType>
</element>
<wsdl:message name=”findAddressRequest”>
<wsdl:part element=”impl:findAddress” name=”parameters”/>
</wsdl:message>
<wsdl:message name=”findAddressResponse”>
<wsdl:part element=”impl:findAddressResponse” name=”parameters”/>
</wsdl:message>
<wsdl:portType name=”AddressBook”>
<wsdl:operation name=”findAddress”>
<wsdl:input message=”impl:findAddressRequest” name=”findAddressRequest”/>
<wsdl:output message=”impl:findAddressResponse” name=”findAddressResponse”/>
</wsdl:operation>
</wsdl:portType>

Якщо ви включили опцію no wrapped style, Буде згенеровано клас, наведений у лістингу 2.


Лістинг 2. Клас згенерований при включеній опції “Generate Java from WSDL using the no wrapped style”





public class AddressBookSoapBindingImpl implements webservice.AddressBook {
public webservice.FindAddressResponse findAddress(webservice.FindAddress parameters)
throws java.rmi.RemoteException {
return null;
}
}

Зверніть увагу на те, що якщо дана опція включена, будуть згенеровані компоненти Java Beans запиту і відповіді для всіх елементів complexType, згаданих в описі операцій WSDL – як верхнього рівня, так і вкладених.


Якщо ви не вибрали опцію Generate Java from WSDL using the no wrapped style, Буде згенеровано клас, наведений у лістингу 3.


Лістинг 3. Клас згенерований при вимкненій опції “Generate Java from WSDL using the no wrapped style”




                 public class AddressBookSoapBindingImpl
implements webservice.AddressBook{
public webservice.Address findAddress
(java.lang.String name)
throws java.rmi.RemoteException {
return null;
}
}

Зверніть увагу на те, що вміст елемента було вилучено з обгортки перед приміщенням в компонент Java Beans.


Generate Java from WSDL using the no wrapped array style for WebSphere V6


Дана опція еквівалентна аргументу WSDL2Java -noWrappedArrays. Вона включає режим ігнорування обгортання масивів. Дізнатися детальніше про обгортанні масивів можна зі статті “Array Gotcha – Null Array vs. Empty Array”.


Приміром, якщо дана опція включена, то з WSDL-коду, наведеного в лістингу 4, буде згенеровано клас, наведений у лістингу 5. В іншому випадку буде згенеровано клас, наведений у лістингу 6.


Лістинг 4. Приклад WSDL-коду





<complexType name=”Address”>
<sequence>
<element name=”province” nillable=”true” type=”xsd:string”/>
<element name=”city” nillable=”true” type=”xsd:string”/>
<element name=”street” nillable=”true” type=”xsd:string”/>
<element name=”postalCode” nillable=”true” type=”xsd:string”/>
<element name=”phoneNumber” nillable=”true” type=”impl:ArrayOfPhoneNumber”/>

</sequence>
</complexType>
<complexType name=”ArrayOfPhoneNumber”>
<sequence>
<element maxOccurs=”unbounded” minOccurs=”0″
name=”number” nillable=”true” type=”xsd:int”/>
</sequence>
</complexType>


Лістинг 5. Клас згенерований при включеній опції “Generate Java from WSDL using the no wrapped array style for WebSphere V6”





public class Address {
private java.lang.Integer[] phoneNumber;
public java.lang.Integer[] getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(java.lang.Integer[] phoneNumber) {
this.phoneNumber = phoneNumber;
}
…….
}

Лістинг 6. Клас згенерований при вимкненій опції “Generate Java from WSDL using the no wrapped array style for WebSphere V6”





public class Address {
……
private webservice.ArrayOfPhoneNumber phoneNumber;
….
public webservice.ArrayOfPhoneNumber getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(webservice.ArrayOfPhoneNumber phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
public class ArrayOfPhoneNumber {
private java.lang.Integer[] number;
public ArrayOfPhoneNumber() {
}
public java.lang.Integer[] getNumber() {
return number;
}
public void setNumber(java.lang.Integer[] number) {
this.number = number;
}
public java.lang.Integer getNumber(int i) {
return this.number[i];
}
public void setNumber(int i, java.lang.Integer value) {
this.number[i] = value;
}
}

Do not backup and overwrite skeleton bean


Іноді виникає необхідність внести зміни в WSDL-код. Після цього можна перегенеріровать код skeleton-компонента з допомогою майстра Web-сервісів. За замовчуванням майстер Web-сервісів замінить існуючий skeleton-компонент і всю міститься в ньому бізнес-логіку новим skeleton-компонентом (за тієї умови, що включений режим заміни файлів).


Щоб при цьому уникнути втрати бізнес-логіки, буде створена резервна копія skeleton-компонента. Майстер Web-сервісів створює резервну копію в тому ж каталозі, що і новий skeleton-компонент, додаючи до імені файлу суфікс “. bak”. Майстер створює тільки одну резервну копію.


Якщо ви дозволите дану опцію, майстер Web-сервісів не буде виконувати резервне копіювання і заміну існуючого skeleton-компонента, а буде використовувати його замість нового.


Незалежно від того, включена дана опція чи ні, вам доведеться виконати деякі дії після внесення змін до WSDL-код і перегенерірованія Web-сервісу. Наприклад, ви створили Web-сервіс “Math” має єдину операцію “Add”. Після цього ви додали операцію “multiply” в WSDL-код і перегенеріровалі Web-сервіс. Якщо опція була виключена, то ви отримаєте новий skeleton-компонент без бізнес-логіки операції “Add”. Щоб її відновити, вам буде потрібно знайти резервну копію старого skeleton-компонента і перенести бізнес-логіку з нього в новий компонент. Якщо опція була включена, то бізнес-логіка залишиться на місці, але метод “multiply” в skeleton-компоненті не з’явиться.


Чи може Rational Application Developer чимось допомогти в такій ситуації? Звичайно! Але для цього вам потрібно буде скористатися функцією “об’єднання skeleton-компонентів” (“skeleton merge”), що з’явилася у версії 7. Ми повернемося до обговорення цієї можливості в розділі Нові можливості Rational Application Developer 7.


Generate beans that implement java.io.Serializable for WebSphere v6


Дана опція еквівалентна аргументу WSDL2Java -genImplSer. Після включення цієї опції кожен згенерований bean-компонент буде реалізовувати java.io.Serializable.


Згідно специфікації EJB (Enterprise JavaBeans ™) 2.1, об’єкти, передані в якості параметрів віддалених викликів, повинні бути серіалізуемим. Якщо ви не станете включати цю опцію і спробуєте згенерувати Web-сервіс на основі EJB skeleton-компонента або клієнта для EJB Web-сервісу, інструментарій видасть інформаційні повідомлення, що попереджають про те, що даний об’єкт повинен бути серіалізуемим.


Set soapAction field to the operation name


Дана опція еквівалентна аргументу WSDL2Java -soapAction. Якщо дана опція вимкнена, то значення відповідного поля в створеному WSDL-коді дорівнює “” (null), як показано на лістингу 7.


Лістинг 7. В поле soapAction записаний null




                  <wsdl:operation name=”sayHello”>
<wsdlsoap:operation soapAction=””/>
<wsdl:input name=”sayHelloRequest”>
<wsdlsoap:body use=”literal”/>
</wsdl:input>
<wsdl:output name=”sayHelloResponse”>
<wsdlsoap:body use=”literal”/>
</wsdl:output>

Якщо опція включена, то в поле soapAction в WSDL-коді буде записано назву операції, як показано на лістингу 8.


Лістинг 8. В поле soapAction записано “sayHello”





<wsdl:operation name=”sayHello”>
<wsdlsoap:operation soapAction=”sayHello”/>
<wsdl:input name=”sayHelloRequest”>
<wsdlsoap:body use=”literal”/>
</wsdl:input>
<wsdl:output name=”sayHelloResponse”>
<wsdlsoap:body use=”literal”/>
</wsdl:output>
</wsdl:operation>

Ми отримували повідомлення про те, що клієнти, що працюють на платформі SAP Portal або SeeBeyond ICAN, не можуть взаємодіяти з Web-сервісами (розробленими за допомогою інструментарію Rational Application Developer і виконуються на сервері додатків IBM ® WebSphere ®), якщо полю -soapAction не присвоєно ніякого значення в WSDL-коді.


Якщо клієнт Web-сервісу вимагає, щоб в поле soapAction було записано значення, відмінне від назви операції, ви можете вручну задати значення даного поля в WSDL-коді.


Нові можливості Rational Application Developer 7


А зараз пропоную обговорити чудові нові можливості Rational Application Developer 7. У Rational Application Developer 7, налаштування, керуючі генеруванням коду, розділені на дві групи: Java2WSDL і WSDL2Java.


Мультипротокольна прив’язка


На вкладці Java2WSDL, Показаної на малюнку 3, знаходяться налаштування найбільш важливою з нових можливостей – мультипротокольной прив’язки.


Рисунок 3. Налаштування прив’язки до HTTP, EJB і JMS
У дереві, в лівій частині вікна, вибрані настройки генерування коду JAX-RPC


Багатопротокольний Java-API для JAX-RPC являє собою розширення моделі програмування JAX-RPC, що додає до існуючих можливостей підтримку таких типів прив’язок, як HTTP (SOAP поверх HTTP), EJB (RMI поверх IIOP) і JMS (SOAP поверх JMS).


Найбільш поширеним типом прив’язки є SOAP поверх HTTP. Однак якщо вас цікавить більш надійний і краще масштабується механізм обміну повідомленнями, зверніть увагу на SOAP поверх JMS, що забезпечує гарантовану доставку повідомлень.


Використання RMI / IIOP замість протоколу, заснованого на SOAP, дозволяє досягти більш високої продуктивності за рахунок виключення надмірної упаковки (marshalling) і розпакування повідомлень. Крім того, це забезпечить підтримку клієнтських транзакцій в Web-сервісах, побудованих на EJB.


З усіх типів прив’язок тільки SOAP поверх HTTP відповідає WS-I, тому в процесі генерування коду Web-сервісів, які використовують прив’язки типів EJB або JMS, буде видаватися попередження про невідповідність.


На закладці WSDL2Java, Показаної на малюнку 4, ви знайдете ще одну чудову можливість інструментарію розробки Web-сервісів IBM Rational Application Developer: SDO-фасад.


Рисунок 4. Установки, керуючі генеруванням SDO-фасадів
У дереві, в лівій частині вікна, вибрані настройки генерування коду JAX-RPC


Disable data binding and use SOAPElement + Generate SDO facades from Java classes


Специфікації JAX-RPC 1.0 і 1.1 визначають стандартні способи перетворення між підмножиною типів XML Schema і Java. Способи перетворення інших типів вважаються необов’язковими, незалежно від того, зазначено це явно чи ні і перетворюються в javax.xml.soap.SOAPElement. До таких типів відносяться xsd:choice, xsd:any, xsd:sequence зі значенням maxOccurs більше одиниці і моделі вкладеного контенту (наприклад, елементи анонімного типу (anonymous)).


Незважаючи на те, що функціональна сумісність Web-сервісів забезпечується WSDL і супутніми стандартами XML, розробникам Web-сервісів і клієнтів для J2EE не слід забувати про проблему перенесення на цю платформу. На жаль, на платформі J2EE стерпним перетворенням типу xsd:choice є SOAPElement.


У світі Web-сервісів більшість користувачів програмують на Java, а не розробляють XML-документи. Цим користувачам потрібен складовою тип Java, відповідний типу XML Schema, а не SOAPElement. І коли їм доводиться працювати з низькорівневим SAAJ (Java API для SOAP з вкладеннями), у багатьох з них виникають складнощі. Описана проблема є однією з найважливіших у світі Java Web-сервісів.


Але вирішена вона для Web-сервісів, реалізованих в сервері додатків WebSphere версій 6.0 і вище? Зрозуміло! Ви можете вибирати між внесенням змін в схему і відключенням прив’язки даних JAX-RPC з подальшим використанням альтернативних технологій прив’язки.


В деяких випадках XML-схема може бути зумовлена ​​виробниками інформаційної системи або правилами бізнесу, і в неї не можна вносити зміни. Єдиним способом вирішення проблеми є тоді використання альтернативної технологій прив’язки даних. Про двох існуючих альтернативних технологіях прив’язки даних можна дізнатися зі статей, перерахованих в розділі Ресурси.


Використання нестандартних методів перетворення даних все ще потребує написання деякого об’єму коду. У той же час до складу Rational Application Developer 7 входить новий інструмент, що автоматизує генерування та адаптацію різних SDO для Java Web-сервісів і клієнтів.


Якщо ви включили як опцію Disable data binding and use SOAPElement так і Generate SDO facades from Java classes, Майстер Web-сервісів створить прості в обігу skeleton-і проксі-компоненти, які використовують для параметрів і значень SDO або базові типи Java замість незручних SOAPElement.


У бібліотеці прикладів коду Rational Application Developer 7 є приклад “WebSphere Web services claims SDO” (“Web-сервіси WebSphere використовують SDO”), що демонструє дану технологію.


Merge generated skeleton file


Цю опцію можна знайти, виконавши команду Window> Preferences > Web Services > Resource Management.


Рисунок 5. Опція “Merge generated skeleton file”
Опція


Якщо дана опція включена і в проекті вже є файл skeleton-компонента з тим же ім’ям, що і у генерується, вони будуть об’єднані зі збереженням існуючої бізнес-логіки. Наприклад, ви створили Web-сервіс Math, Що має єдину операцію Add. Після цього ви додали операцію multiply в WSDL-код і перегенеріровалі Web-сервіс. Якщо опція включена, ви виявите в коді згенерованого skeleton-компонента як новий метод multiply, Так і вже перебував там метод Add, Що містить бізнес-логіку.


Тепер ви більше знаєте про вплив опцій сторінки налаштування параметрів на процес генерування коду.


У наступних статтях циклу ми обговоримо прийоми роботи з майстром Web-сервісів, засобами тестування і моніторингу та загальні питання генерування коду Web-сервісів.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*