Sdscompany.ru

Компьютерный журнал
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java web service example

Знакомимся с CXF

Еще одна инфраструктура Web-сервисов от Apache Software Foundation

Серия контента:

Этот контент является частью # из серии # статей: Web-сервисы Java

Этот контент является частью серии: Web-сервисы Java

Следите за выходом новых статей этой серии.

CXF — это еще один стек Web-сервисов от Apache Software Foundation – той же группы, которая разработала Axis2. Хотя эти стеки разработаны в одной организации, Axis 2 и CXF используют очень разные подходы к конфигурированию и исполнению Web-сервисов. В этой статье мы узнаем об основах использования JAXB 2.x и JAX-WS 2.x для работы с Web-сервисами с помощью CXF, а также сравним CXF с другими стеками на основе JAXB/JAX-WS: Axis2 и Metro, которые мы обсуждали в предыдущих статьях.

Основы CXF

Пользовательский интерфейс CXF имеет много общего с интерфейсами стеков Axis2 и Metro. Все три стека позволяют создать Web-сервис на основе существующего кода Java™ или же сгенерировать код Java на основе WSDL-описания для использования или реализации сервиса. Как и другие стеки, CXF моделирует операции с сервисом в виде вызовов методов, а порты сервиса (portType) — в виде интерфейсов.

Об этом цикле статей

Web-сервисы занимают одно из центральных мест в современных корпоративных Java-приложениях. В серии «Web-сервисы Java» консультант по этим технологиям Деннис Сосноски рассказывает об основных системах и решениях, представляющих интерес для Java-разработчиков, использующих Web-сервисы. Следите за статьями этой серии, и вы будете получать самую свежую информацию о последних разработках в данной области и о том, как их можно применить в ваших проектах.

Аналогично Axis2, но в противоположность Metro, CXF позволяет выбирать между различными технологиями связывания с данными. CXF поддерживает связывание с данными JAXB 2.x наравне с Metro и несколько лучше, чем Axis2, потому что он позволяет настраивать JAXB при генерации кода из WSDL-описания сервиса (Axis2 этого не позволяет). CXF также позволяет использовать другие методы связывания с данными, хотя их поддержка реализована не так хорошо, как в Axis2. Например, генерировать код из WSDL-файла в CXF можно только при использовании связывания с данными JAXB или XMLBeans.

Предпочтительным методом конфигурирования сервиса (который в терминологии CXF называется frontend) в CXF являются аннотации JAX-WS 2.x, дополняемые конфигурационными XML-файлами. Поддержка аннотаций JAX-WS в CXF находится на одном уровне с Metro, что делает эту инфраструктуру намного предпочтительнее для работы с JAX-WS, чем Axis2 (поддержка JAX-WS в котором имеет несколько серьезных ограничений, которые обсуждались в статье «JAXB и JAX-WS в Axis2»). Как и другие реализации JAX-WS, CXF требует наличия WSDL-описания на стороне клиента во время выполнения.

Как и в других стеках, в CXF обработка запросов и ответов осуществляется набором конфигурируемых компонентов. В CXF эти компоненты называются перехватчиками (intercepters), а не обработчиками (handlers), но, несмотря на разные названия, эти термины обозначают одни и те же компоненты. Как и Metro, CXF в базовой загрузке поддерживает WS-Security и другие дополнительные технологии. В отличие от Metro, JAR-архивы CXF являются модульными. В зависимости от используемых технологий вы можете выбрать и включить в свое приложение лишь нужные вам файлы (в директории CXF в файле /lib/WHICH_JARS описывается, какие JAR-файлы нужны при различных типовых вариантах использования). Недостатком такой модульности является то, что в итоге, возможно, придется иметь дело с длинным списком JAR-файлов, нужных вашему приложению, а достоинством — то, что она позволяет сократить размер разворачиваемого приложения.

Как и Metro, CXF обычно требует собрать для Web-сервиса один WAR-файл вместо развертывания потенциально нескольких сервисов внутри одного сервера (подход, применяемый в Axis2). CXF также предоставляет встроенный HTTP-сервер Jetty, пригодный для использования в рабочей среде. Он является более гибкой и мощной альтернативой простым серверам HTTP, интегрированным в Axis2 и Metro.

Пример приложения

В разделе загрузки кода представлена версия простого сервиса управления библиотекой, который мы использовали в предыдущих статьях этого цикла. Здесь мы его модифицируем для демонстрации работы с CXF. Как и ранее, WSDL определяет четыре операции:

  • getBook возвращает подробную информацию по книге. Книга идентифицируется по международному стандартному номеру ISBN (International Standard Book Number).
  • getBooksByType возвращает подробную информацию обо всех книгах определенного типа.
  • getTypes возвращает имеющиеся типы книг.
  • addBook добавляет в библиотеку новую книгу.

В статье «JAXB и JAX-WS в Axis2» мы видели, как это приложение работало в Axis2, затем в статье «Introducing Metro», мы рассмотрели его работу в Metro. Большая часть рассуждений, приведенных в предыдущих статьях, также применима и для CXF. Описание WSDL выглядит точно так же, за исключением имени сервиса и адреса конечной точки. Сгенерированная модель данных JAXB тоже такая же. Идентичны даже сгенерированные классы сервиса, за исключением пакета Java и имени сервиса, используемого в аннотациях JAX-WS.

Использование на клиентской стороне

Клиентский код для нашего приложения на CXF идентичен использованию JAX-WS в Axis2 или Metro. Шаги по сборке клиента также очень похожи: используйте входящую в CXF утилиту wsdl2java вместо разработанной для JAX-WS программы wsimport. За подробной информацией о работе с клиентским кодом обращайтесь к статье «JAXB и JAX-WS в Axis2».

Хотя клиентский код одинаков, в поведении клиента CXF имеется существенное отличие. По умолчанию CXF выводит в консоль слишком большое количество информации. CXF использует пакет Java Logging, поэтому, чтобы избавиться от этого, необходимо указать приложению на файл настроек журналирования, сконфигурированный для вывода информации только на уровнях WARNING или SEVERE . В Ant в файле build.xml нашего приложения адрес этого конфигурационного файла указывается с помощью следующего параметра JVM: .

Использование на серверной стороне

Серверный код нашего приложения на CXF также идентичен использованию JAX-WS в Axis2 или Metro. Процесс сборки также очень похож на Metro. В Axis2, мы подготавливали сервис к развертыванию, создавая JAR-файл с классами сервиса и модели данных, а затем разворачивали сервис, помещая этот JAR-файл в директорию WEB-INF/servicejars сервера Axis2. В Metro и CXF вместо этого нужно создать WAR-файл, содержащий классы сервиса и модели данных, библиотечные JAR-файлы Metro или CXF и пару конфигурационных файлов (один из которых называется по разному в этих двух стеках). В файле WEB-INF/web.xml конфигурируется непосредственно обработка запросов сервлетом. В листинге 1 показана версия этого файла, используемая в нашем приложении:

Листинг 1. Файл web.xml в примере приложения

Приведенный в листинге 1 файл WEB-INF/web.xml является всего лишь стандартным конфигурационным файлом сервлета, сообщающим серверу Web-приложений (например Tomcat), как взаимодействовать с сервлетом. Данный файл похож на файл, использованный в примере для Metro, хотя для CXF атрибут является частью кода CXF, а
указывает на класс инфраструктуры Spring (см. Ресурсы). Как и в примере для Metro, сервлет сконфигурирован так, чтобы обрабатывать все запросы, поступающие к данному Web-приложению (это делается в атрибуте / ).

Отдельный файл — WEB-INF/cxf-servlet.xml — используется для настройки в CXF маршрутизации получаемых сервлетом запросов к коду сервиса и задания адреса, по которому можно будет обнаружить WSDL — описание сервиса. Этот файл показан в листинге 2:

Листинг 2. Файл cxf-servlet.xml в примере приложения

В файле WEB-INF/cxf-servlet.xml из листинга 2 определяется одна конечная точка сервиса с классом реализации, шаблоном запросов и местоположением документа WSDL. Адрес документа WSDL является единственной необязательной частью определения конечной точки. Если в файле cxf-servlet.xml не указать для конечной точки сервиса адрес документа WSDL, то CXF автоматически сгенерирует его во время выполнения на основе аннотаций JAX-WS.

Сборка и запуск кода

Проблемы сборки

Начиная с Java SE 6, реализации JAXB 2.x и JAX-WS 2.x (за исключением расширений) стали частью стандартных библиотек Java Runtime Environment (JRE). Это было сделано для поощрения использования этих технологий. Однако у этого благого намерения обнаружилась неприятная оборотная сторона: теперь при необходимости использовать свежие версии данных библиотек необходимо изменять уже установленную JRE.

Файл build.xml, используемый в нашем примере приложения, копирует необходимые CXF JAR-файлы непосредственно в WAR-файл сервиса. В их число входят JAR-файлы JAXB и JAX-WS для сборки на Java SE 5; но когда вы делаете сборку на Java SE 6, процедура сборки будет использовать версии JAXB и JAX-WS из установки JVM. Если конфликты загрузки файлов вызывают проблемы в коде JAXB или JAX-WS при использовании Java SE 6 или более новой версии, проверьте, есть ли к вашему дистрибутиву CXF какие-нибудь замечания о совместимости с различными версиями JVM.

Перед началом работы с примером приложения, вам нужно загрузить и установить себе на систему текущую версию CXF (см. Ресурсы). Код приложения тестировался с версией 2.2.5. Также нужно отредактировать файл build.properties, находящийся в корневом каталоге. Найдите в нем атрибут cxf-home и задайте ему значение пути, по которому установлен CXF. Если вы будете тестировать приложение с сервером, работающем на другой машине, или порту, отличном от стандартного, вам следует изменить атрибуты host-name и host-port .

Чтобы собрать приложение с помощью файла build.xml для Ant, откройте консоль в корневой директории кода приложения и выполните команду ant . Эта команда сначала запускает программу wsdl2java (включенную в дистрибутив CXF), затем скомпилирует код клиента и сервера, и, наконец, упакует код сервера в WAR-архив. Затем можно развернуть сгенерированный файл cxf-library.war на тестовом сервере, и, набрав в консоли ant run , запустить клиент приложения. Клиент выполняет серию запросов к серверу, печатая краткую информацию о результате каждого запроса. Как уже упоминалось в разделе Использование на клиентской стороне, при сборке мы сконфигурировали журналирование CXF так, чтобы избежать вывода детальной информации при запуске клиента.

Spring в CXF

Обратите внимание, что в конфигурационном файле cxf-servlet.xml, указанном в листинге 2, фактически конфигурируется bean-компонент Spring Framework. Как вы, возможно, знаете, Spring — это инфраструктура с открытым исходным кодом для разработки приложений. Она включает в себя множество компонентов и библиотек, которые можно использовать в своем приложении. Изначально в основе Spring лежал контейнер Inversion of Control (IoC). Он позволяет связывать и конфигурировать JavaBean — компоненты, используя механизм отражения Java для доступа к свойствам bean-объектов во время выполнения.

Контейнер Spring IoC, как правило, использует для получения информации о зависимостях XML-файлы. Приведенный в листинге 2 файл cxf-servlet.xml является примером подобного конфигурационного файла Spring. Элемент является всего лишь оболочкой конфигурации конкретного bean-элемента. Элемент является таким bean-элементом, который CXF ассоциирует с определенным типом объектов (экземпляром класса org.apache.cxf.jaxws.EndpointImpl ).

В файле cxf-servlet.xml можно указать множество других параметров, не используемых в этом простом примере, в том числе конфигурацию потока сообщений сервиса. С детальной информацией о конфигурации JAX-WS можно ознакомиться в документации CXF (в разделе Frontends/JAX-WS).

За исключением аннотаций JAX-WS, Spring используется для всей конфигурации стека CXF, в том числе для организации работы внутренних сообщений CXF. В большинстве случаев все детали настройки обрабатываются автоматически, с помощью конфигурационных XML-файлов, включенных непосредственно в CXF (в параметре contextConfigLocation в файле web.xml из листинга 1, можно увидеть, как именно эти файлы указываются). Однако типичную конфигурацию можно переопределить или расширить, используя свои собственные конфигурационные файлы. Мы не будем рассказывать об этом в данном цикле статей, за подробной информацией по этой теме обращайтесь к документации CXF.

Продолжим знакомство с CXF

В данной статье мы познакомились с основами работы со стеком Web-сервисов CXF, а именно с использованием связывания с данными JAXB 2.x и основанной на аннотациях конфигурации JAX-WS 2.x. Код для JAXB/JAX-WS, использованный ранее в статьях, посвященных Axis2 и Metro, также работает и в CXF. Мы сделали лишь несколько незначительных изменений в настройках сборки и использовали другой файл развертывания и конфигурации. Такая совместимость является главным преимуществом использования JAXB и JAX-WS, так как она облегчает переключение между стеками.

Читать еще:  Javascript движение объектов

В CXF имеется множество возможностей, не раскрытых в этом простом примере, и в следующих статьях мы расскажем о некоторых из них. В следующей статье мы рассмотрим использование WS-Security, и сравним реализацию этой технологии в CXF с реализациями в Axis2 и Metro.

JAX-RS Web Service Example

Posted by: Yatin in rest November 9th, 2017 2 Comments Views

Hello readers. In this tutorial, we will show how to use the JAX-RS (RESTful) jar files to implement a simple Hello World Web Service in Java.

1. Introduction

JAX-RS stands for RESTful Web Services. JAX-RS is a set of APIs to develop the REST services . It is part of the Java EE6 and makes developers to develop the REST web application easily. JAX-RS makes extensive use of annotations available from Java SE 5 to simplify the coding and development of Java-based Web Services.

There are two main implementations of the JAX-RS API:

  • Jersey
  • RESTEasy

Fig. 1: JAX-RS Implementation

Following are the commonly used annotations in JAX-RS to map a resource as a web service resource.

Now, open up the Eclipse IDE and let’s see how to develop a RESTful Hello World web application with JAX-RS!

2. Java Web Service Example

Here is a step-by-step guide for implementing the Web Service framework in Java.

2.1 Tools Used

We are using Eclipse Kepler SR2, JDK 8 and Maven. Having said that, we have tested the code against JDK 1.7 and it works well.

2.2 Project Structure

Firstly, let’s review the final project structure, in case you are confused about where you should create the corresponding files or folder later!

Fig. 2: Application Project Structure

2.3 Project Creation

This section will demonstrate on how to create a Java-based Maven project with Eclipse. In Eclipse IDE, go to File -> New -> Maven Project .

Fig. 3: Create Maven Project

In the New Maven Project window, it will ask you to select project location. By default, ‘Use default workspace location’ will be selected. Just click on next button to proceed.

Fig. 4: Project Details

Select the ‘Maven Web App’ Archetype from the list of options and click next.

Fig. 5: Archetype Selection

It will ask you to ‘Enter the group and the artifact id for the project’. We will input the details as shown in the below image. The version number will be by default: 0.0.1-SNAPSHOT .

Fig. 6: Archetype Parameters

Click on Finish and the creation of a maven project is completed. If you observe, it has downloaded the maven dependencies and a pom.xml file will be created. It will have the following code:

We can start adding the dependencies that developers want like Jersey, Junit etc. Let’s start building the application!

3. Application Building

Below are the steps involved in developing this application.

3.1 Maven Dependencies

Here, we specify the dependencies for the Web Service framework. The rest dependencies will be automatically resolved by the Maven framework and the updated file will have the following code:

3.2 Java Class Creation

Let’s create the required Java files. Right-click on src/main/java folder, New -> Package .

Fig. 7: Java Package Creation

A new pop window will open where we will enter the package name as: com.jcg.webservice .

Fig. 8: Java Package Name (com.jcg.webservice)

Once the package is created in the application, we will need to create the controller class. Right-click on the newly created package: New -> Class .

Fig. 9: Java Class Creation

A new pop window will open and enter the file name as: HelloWorldService . The sample Service class will be created inside the package: com.jcg.webservice .

Fig. 10: Java Class (HelloWorldService.java)

3.2.1 Implementation of Service Class

Let’s see the simple code snippet that follows the JAX-RS implementation.

3.3 Configuration Application’s Deployment Descriptor

Let’s write the deployment descriptor involved in this application. In web.xml , register the com.sun.jersey.spi.container.servlet.ServletContainer and put the Jersey Service folder under the i.e.

Add the following code to it:

4. Run the Application

As we are ready with all the changes, let us compile the project and deploy the application on the Tomcat7 server. To deploy the application on Tomat7, right-click on the project and navigate to Run as -> Run on Server .

Fig. 11: How to Deploy Application on Tomcat

Tomcat will deploy the application in its web-apps folder and shall start its execution to deploy the project so that we can go ahead and test it on the browser.

5. Project Demo

Open your favorite browser and hit the following URL. The default page will be displayed.

Server name (localhost) and port (8085) may vary as per your Tomcat configuration. Developers can debug the example and see what happens after every step. Enjoy!

In web.xml we have specified the URL pattern as /rest/* and in HelloWorldService.java , we specified class level @path as /hello and method level @path as . So the final URL should be http://localhost:8085/JavaWebService/rest/hello/java .

Test your REST service under the updated URL and you will get the following output.

Fig. 12: Welcome Page

That’s all for this post. Happy Learning!!

6. Conclusion

In this section, developers learned how to implement a simple Hello World Web Service in Java. Developers can download the sample application as an Eclipse project in the Downloads section. I hope this article served you with whatever developers were looking for.

7. Download the Eclipse Project

This was an example of Servlet Application Login.

Web-сервис SOAP в Eclipse

Что такое веб-сервис SOAP (Simple Object Access Protocol) и с чем его «едят»? В предыдущей статье было сказано, что web-сервисы представляют собой процесс взаимодействия приложений по протоколу HTTP, а SOAP определяет протокол реализации web-сервиса и является дальнейшим развитием XML-RPC (XML-вызов удалённых процедур). Если не вдаваться в сложности процесса взаимодействия клиент/серверных приложений, то можно сказать, что имеется некий сервер, который управляет информацией (добавляет, удаляет, обновляет, хранит) и выдает клиентам информацию по запросам в формате XML. Клиенты могут обращаться к такому серверу только по протоколу HTTP с оформлением запроса в формате XML. Т.е. клиент с сервером обмениваются только XML-информацией, и ни каких картинок, аудио, видео. Такой сервер может предоставлять информацию (веб-сервис) о погоде, об авиационном или железнодорожном расписании, о курсе валют и т.д.

Каждый web-сервис SOAP имеет описание в виде файла wsdl. WSDL (Web Services Description Language) — язык описания веб-сервисов и доступа к ним в формате XML.

В данной статье рассмотрим вопрос создания WEB-сервиса SOAP в IDE Eclipse с практической точки зрения. Т.е. создадим, запустим и протестируем веб-сервис SOAP. Как говорится, лучше один раз, чем ни разу.

Apache Axis

Для разработки WEB-сервиса были использованы Eclipse Luna (4.4.2), Apache Tomcat v8.5.4 и Apache Axis. Полагаю, что версии Eclipse и Tomcat не критичны для решения данной задачи. Можно использовать и другие версии.

Особо следует сказать об Apache Axis (Apache eXtensible Interaction System), который является фреймворком веб-сервиса с открытым исходным кодом. AXIS включает в себя контейнер для размещения и использования веб-сервисов на серверах приложений, утилиты для работы с WSDL-описаниями, классы для разработки веб-сервисов и их клиентов. В нашем примере AXIS будет использоваться для создания и тестирования WEB-сервиса и вызываться он будет из Eclipse.

Описание примера

Чтобы в Eclipse создать простейший WEB-сервис SOAP, а потом запустить его и протестировать, надо хорошо знать Eclipse, поскольку он всё сделает сам, включая создание файла wsdl. Поэтому кодировать придется очень мало, а в большей степени разбираться со скриншотами интерфейса IDE Eclipse.

Создадим WEB-сервис, который управляет персоналом и позволяет добавлять и удалять сотрудников, просматривать список сотрудников и выполнять поиск сотрудника по идентификатору. Начнем с проекта, тип которого в Eclipse должен быть ‘Dynamic Web Project’. Определим наименование проекта как ‘SoapServer’ :

В проекте создадим класс сотрудника Person, интерфейс описания методов PersonService и класс реализации методов PersonServiceImpl. На этом программирование заканчивается.

Листинг класса Person

Класс сотрудника включает идентификатор id и имя name (проще и не придумать). Также в классе определим методы get/set.

Листинг интерфейса PersonService

Интерфейс определяет методы добавления нового сотрудника addPerson, удаление сотрудника deletePerson, получение сотрудника по идентификатору getPerson и чтение списка сотрудников getPersons.

Листинг класса PersonServiceImpl

Класс PersonServiceImpl реализует методы интерфейса.

Примечание : при каждом вызове сервиса (одного из его методов) создается объект PersonServiceImpl, в конструкторе которого выполняется проверка создания коллекции сотрудников. Поэтому коллекция сотрудников объявлена статической.

Cоздание WEB-сервиса SOAP

Для создания WEB-сервиса необходимо выделить реализацию интерфейса PersonServiceImpl и в контекстном меню, вызываемом правой клавишей мыши, выбрать ‘Web Service’ (New/Other/Web Services/Web Service). Будет открыто окно мастера создания веб-сервиса, в котором представлена конфигурация создания веб-сервиса, включающая Tomcat, Apache Axis и наш проект SoapServer (вот где объявилась среда разработки в виде Tomcat и Apache Axis).

Здесь можно ничего не делать, только проверьте ‘Service Implementation’, чтобы был выбран соответствующий класс, установите галочки публикации и мониторинга веб-сервиса в нижней части формы (‘Publish the Web service’, ‘Monitor the Web service’) и можно переходить к следующему шагу нажатием кнопки Next.

На этом шаге будет представлен список всех методов веб-сервиса (класса реализации интерфейса), описанных в файле PersonServiceImpl.wsdl :

Можно завершить процесс создания WEB-сервиса нажатием кнопки Finish. Но из любопытства все же заглянем в последнее окно и нажмем кнопку Next.

Здесь мы видим, что мастер завершил свою работу и предлагает стартовать Tomcat. Нажимаем на кнопку ‘Start server’ и завершаем после этого работу с мастером. Теперь можно посмотреть, что сделал мастер разработки WEB-сервиса с нашим проектом.

Структура проекта WEB-сервиса SOAP

Мы только создали два класса и интерфейс, а остальное создал мастер, включая поддиректорию с файлами WEB-INF/PersonServiceImplService, файл WEB-INF/server-config.wsdd и описание сервиса в виде PersonServiceImpl.wsdl в поддиректории WEB-INF/wsdl. Он же внес в дескриптор приложения web.xml изменения, связанные с web-сервисом.

В скриншоте не развернута директория lib, в которую мастер включил необходимые для веб-сервиса библиотеки jar :

  • axis.jar
  • commons-discovery-0.2.jar
  • commons-logging.jar
  • jaxrpc.jar
  • saaj.jar
  • wsdl4j.jar

Дескриптор приложения web.xml

В дескриптор приложения вносить изменений не требуется, если не считать удаление отсутствующих в проекте открываемых страниц по умолчанию (секция . Мастер создания веб-сервиса всю необходимую информацию вписал сам.

Старт WEB-сервиса SOAP

Для работы с веб-сервисом необходимо стартовать (если еще не стартовано) web-приложение SoapServer. Для этого, нажимая правой клавишей мыши на проекте, вызываем контекстное меню и выбираем ‘Run As/Run on Server’. В открывшемся окне выбора сервера приложений выделяем Tomcat и нажимаем кнопку Finish.

В браузере будет открыта страница проекта по умолчанию, которой у нас нет. Браузер/вкладку с открывшейся с ошибкой страницей можно закрыть, она нам не пригодится. На вкладке серверов (скриншот ниже) можно увидеть, что сервер стартован и приложение SoapServer загружено в его контейнер.

Для старта приложения управления веб-сервисом Axis необходимо найти и нажать в панели инструментов кнопку, представленную на следующем скриншоте с подсказкой ‘Launch the Web Service Explorer’.

Читать еще:  Java msi installer

В результате в браузере будет открыта страница Web Services Explorer, интерфейс которой представлен на следующем скриншоте. Окно приложения Web Services Explorer включает панель инструментов с кнопками (справа вверху) и три области : Navigator, Actions, Status. На строку URL не обращаем внимания, нам с ней не работать.

Первое, что нам необходимо, так это выбрать режим WSDL. Для этого в панели инструментов находим нужную нам кнопку и нажимаем. Корневым элементом в дереве Navigator’а отобразиться ‘WSDL Main’ и в панели Actions будут представлены компоненты для работы с WSDL (скриншот сверху). Здесь можно подключиться к веб-сервису в Интернете. Но мы пойдем другим путём и выберем наш файл PersonServiceImpl.wsdl с описанием веб-сервиса из запущенного проекта SoapServer. Вводим в строке соответствующий адрес URI, начинающийся с file: и нажимаем кнопку ‘GO’. Если всё правильно сделано и всё работает, то в Navigator’e будет отображена структура нашего WEB-сервиса, как это представлено на следующем скриншоте.

Переходим к тестированию методов WEB-сервиса. Выполним только добавление новых сотрудников и просмотрим список. Остальные методы Вы можете проверить самостоятельно.

Добавление сотрудника

Для добавления нового сотрудника выделяем соответствующий метод в Navigator’e; в панели Actions в секции Body будет представлен выбранный метод и параметры. Вводим идентификатор, русскоязычное имя ‘Всеволод’ и нажимаем кнопку GO. Результат выполнения метода веб-сервиса можно увидеть в панели Status.

Чтобы просмотреть текст запроса и ответа веб-сервиса в панели Status нажимаем на link ‘Source’. В результате в интерфейсе панели (скриншот ниже) будут открыты компонент с описанием запроса ‘SOAP Request Envelope’ и компонент с описанием ответа ‘SOAP Response Envelope’ в формате XML. Обратите внимание, что русскоязычное имя в запросе отображено в виде вопросительных знаков. После этого были добавлены еще два сотрудника Serg (id=2) и Olga (id=3).

Чтение списка сотрудников

А как будет представлен сотрудник в списке, имя которого имеет кириллицу? Выделяем в Navigator’e метод getPersons, нажимаем кнопку ‘GO’ и смотрим результат запроса в панели Status в режиме Form (следующий скриншот). Всё нормально, имя представлено верно в кириллице. Т.е. не потребовалось «изголяться» с charset’ами для передачи и чтения текстовой информации не в ASCII-коде.

Но вот при просмотре запроса и ответа в панели Status в режиме Source видим, что кириллица отображается в виде вопросительных знаков.

Заключение

В статье был рассмотрен вопрос создания и тестирования WEB-сервиса в IDE Eclipse. Основную цель, которую я преследовал при изложении данной информации, показать, что такое WEB-сервис SOAP, как его можно практически создать и протестировать. Представленный материал должен позволить Вам взглянуть во «внутренности» WEB-сервиса SOAP и понять сущность данной технологии.

Создание клиента WEB-сервиса на примере рассмотрен здесь. Второй пример SOAP клиента с авторизацией представлен здесь.

JAX-WS Hello World Example – RPC Style

JAX-WS is bundled with JDK 1.6, which makes Java web service development easier to develop. This tutorial shows you how to do the following tasks:

  1. Create a SOAP-based RPC style web service endpoint by using JAX-WS.
  2. Create a Java web service client manually.
  3. Create a Java web service client via wsimport tool.
  4. Create a Ruby web service client.

You will be surprise of how simple it is to develop a RPC style web service in JAX-WS.

JAX-WS Web Service End Point

The following steps showing how to use JAX-WS to create a RPC style web service endpoint.

1. Create a Web Service Endpoint Interface

2. Create a Web Service Endpoint Implementation

3. Create a Endpoint Publisher

Run the endpoint publisher, and your “hello world web service” is deployed in URL “http://localhost:9999/ws/hello“.

4. Test It

You can test the deployed web service by accessing the generated WSDL (Web Service Definition Language) document via this URL “http://localhost:9999/ws/hello?wsdl” .

Web Service Clients

Ok, web service is deployed properly, now let’s see how to create web service client to access to the published service.

1. Java Web Service Client

Without tool, you can create a Java web service client like this :

2. Java Web Service Client via wsimport tool

Alternative, you can use “wsimport” tool to parse the published wsdl file, and generate necessary client files (stub) to access the published web service.

Issue “wsimport” command.

It will generate necessary client files, which is depends on the provided wsdl file. In this case, it will generate one interface and one service implementation file.

Now, create a Java web service client which depends on the above generated files.

Here’s the output

3. Ruby Web Service Client

Often time, web service development is mixed use with other programming language. So, here’s a Ruby web service client example, which is used to access the published JAX-WS service.

Tracing SOAP Traffic

From top to bottom, showing how SOAP envelope flows between client and server. See #1 web service client again :

1. Request a WSDL file

First, client send a wsdl request to service endpoint, see HTTP traffic below :

Client send request :

Server send response :

2. hello.getHelloWorldAsString()

A second call, client put method invoke request in SOAP envelope and send it to service endpoint. At the service endpoint, call the requested method and put the result in a SOAP envelope and send it back to client.

Client send request :

Server send response :

Done, any comments are appreciated.

Download Source Code

mkyong

Comments

I really like these tutorials – you manage to show the simplest possible examples that work. It has given me a nice start in the web services world.

Simply the the best!

[…] the traced messaged in the “TCP/IP Monitor” view if any. Note You can copy this JAX-WS web service example and do the testing yourself. For Netbean users In Netbean IDE, you can use TCP monitor to trace […]

[…] you how to use JAX-WS to create a SOAP-based web service (document style) endpoint. Compare with RPC style, it need some extra efforts to get it […]

Hello – I preferably should suggest, impressed with your site. I had no trouble navigating through all the tabs and so guidance had been genuinely easy to access. I came across what I hoped for very quickly all the way. Plus extremely good. Would most likely appreciate it in the event you add forums or something, it becomes much easier a fantastic way for your consumers to work together. Fine job..

[…] Tomcat to support SSL and deployed this simple hello world web service. And use following client connect to the deployed web service over SSL connection : package […]

[…] commkyongwsServerInfoImplService.java Note For complete example, please visit this JAX-WS hello world example article, refer to the section “2. Java Web Service Client via wsimport […]

[…] JAX-WS hello world example – RPC Style Tutorial to show you how to create a rpc style web service endpoint by using JAX-WS, and web service client in Java, wsimport and Ruby. […]

Thanks a lot.
I was wondering such a nice WS example since very long time.
Now I am relaxed doing all these example.
I request to you,Pls give EJB 3.0 tutorial such a nice way.
Thanks in advance.

I am new to web service. Got a dumb question for you all.
The client already have created stuf code out of the WSDL. Why is it asking for WSDL again in the first request? Why can it just send the second request alone?

Also, I notice sometimes the endpoint does not include “?wsdl”. what is the difference between including “?wsdl” and not including “?wsdl”?

Any comment is appreciated. Thanks,

1. It’s depends on how you write the code. If you sure your client WSDL will never change, then just get a copy and integrate with your application locally.

2. WSDL is for SOAP service. Appending “?wsdl” at the end of the web service means to get the wsdl file content. Without “?wsdl” is the WS URL. For restful web service, it does not contains any of “?wsdl” as well.

That helps. Thanks a lot. And I love your site. Easy to follow and very well organized. Better than any other tutorial site I have ever seen. Keep up the good work рџ™‚

in the source code, the class HelloWorldClient.java is not correct. While it shows in this page the next line:

URL url = new URL(“http://localhost:9999/ws/hello?wsdl”);

In the source code zip, it shows like that:

URL url = new URL(“http://localhost:8888/ws/hello?wsdl”);

So unless you change the port back to 9999 it will not work.

Ok, I did not realize that it was like that because it was calling the monitor first…

It’s really good point. I encountered the same problem. So once again if one runs HelloWorldClient.java without TCP Monitor one should put
URL url = new URL(“http://localhost:9999/ws/hello?wsdl”); to make everything work.
If one runs TCP Monitor and fill in TCP monitor information exactly as here http://www.mkyong.com/webservices/jax-ws/how-to-trace-soap-message-in-eclipse-ide/ then one really needs the following:
URL url = new URL(“http://localhost:8888/ws/hello?wsdl”);

Could the author take this remark to consideration?
In general this is good article.

how can i deploy this to prod server…

Why am I taking this exception ?

please post your error stacks

thanks for such a great effort on jax-ws

I like a lot the clear style of the examples but unfortunately I cannot make them work. Everything compiles and runs fine but it doesnt generate an wsdl file at all
Keep on getting message that resource is not found which seems logical since there is no wsdl file

I’m using Netbeans and glassfish. I create a web project but don’t see webservices in the project tree .

Would it be possible to give me some guidance ?
As You’ve already grasped I’m a newbee to this.

Don’t depends on Netbean to create web services, the generated web services from Netbean are complex and hard to maintenance (at least to me). JAX-WS is easily to develop, try create it without the help of Netbean, and you will learn a lot. In WS development, normally we use code to wsdl method, because it ‘s fast and easy. Often time, we just code and never worry about the wsdl file. After WS is deployed, the WS runtime will generate wsdl file for WS client to consume, automatically. My advice is don’t use netbean, it add too much extra codes … Read more »

Знакомимся с CXF

Еще одна инфраструктура Web-сервисов от Apache Software Foundation

Серия контента:

Этот контент является частью # из серии # статей: Web-сервисы Java

Этот контент является частью серии: Web-сервисы Java

Следите за выходом новых статей этой серии.

CXF — это еще один стек Web-сервисов от Apache Software Foundation – той же группы, которая разработала Axis2. Хотя эти стеки разработаны в одной организации, Axis 2 и CXF используют очень разные подходы к конфигурированию и исполнению Web-сервисов. В этой статье мы узнаем об основах использования JAXB 2.x и JAX-WS 2.x для работы с Web-сервисами с помощью CXF, а также сравним CXF с другими стеками на основе JAXB/JAX-WS: Axis2 и Metro, которые мы обсуждали в предыдущих статьях.

Читать еще:  Код ошибки 192 в плей маркете

Основы CXF

Пользовательский интерфейс CXF имеет много общего с интерфейсами стеков Axis2 и Metro. Все три стека позволяют создать Web-сервис на основе существующего кода Java™ или же сгенерировать код Java на основе WSDL-описания для использования или реализации сервиса. Как и другие стеки, CXF моделирует операции с сервисом в виде вызовов методов, а порты сервиса (portType) — в виде интерфейсов.

Об этом цикле статей

Web-сервисы занимают одно из центральных мест в современных корпоративных Java-приложениях. В серии «Web-сервисы Java» консультант по этим технологиям Деннис Сосноски рассказывает об основных системах и решениях, представляющих интерес для Java-разработчиков, использующих Web-сервисы. Следите за статьями этой серии, и вы будете получать самую свежую информацию о последних разработках в данной области и о том, как их можно применить в ваших проектах.

Аналогично Axis2, но в противоположность Metro, CXF позволяет выбирать между различными технологиями связывания с данными. CXF поддерживает связывание с данными JAXB 2.x наравне с Metro и несколько лучше, чем Axis2, потому что он позволяет настраивать JAXB при генерации кода из WSDL-описания сервиса (Axis2 этого не позволяет). CXF также позволяет использовать другие методы связывания с данными, хотя их поддержка реализована не так хорошо, как в Axis2. Например, генерировать код из WSDL-файла в CXF можно только при использовании связывания с данными JAXB или XMLBeans.

Предпочтительным методом конфигурирования сервиса (который в терминологии CXF называется frontend) в CXF являются аннотации JAX-WS 2.x, дополняемые конфигурационными XML-файлами. Поддержка аннотаций JAX-WS в CXF находится на одном уровне с Metro, что делает эту инфраструктуру намного предпочтительнее для работы с JAX-WS, чем Axis2 (поддержка JAX-WS в котором имеет несколько серьезных ограничений, которые обсуждались в статье «JAXB и JAX-WS в Axis2»). Как и другие реализации JAX-WS, CXF требует наличия WSDL-описания на стороне клиента во время выполнения.

Как и в других стеках, в CXF обработка запросов и ответов осуществляется набором конфигурируемых компонентов. В CXF эти компоненты называются перехватчиками (intercepters), а не обработчиками (handlers), но, несмотря на разные названия, эти термины обозначают одни и те же компоненты. Как и Metro, CXF в базовой загрузке поддерживает WS-Security и другие дополнительные технологии. В отличие от Metro, JAR-архивы CXF являются модульными. В зависимости от используемых технологий вы можете выбрать и включить в свое приложение лишь нужные вам файлы (в директории CXF в файле /lib/WHICH_JARS описывается, какие JAR-файлы нужны при различных типовых вариантах использования). Недостатком такой модульности является то, что в итоге, возможно, придется иметь дело с длинным списком JAR-файлов, нужных вашему приложению, а достоинством — то, что она позволяет сократить размер разворачиваемого приложения.

Как и Metro, CXF обычно требует собрать для Web-сервиса один WAR-файл вместо развертывания потенциально нескольких сервисов внутри одного сервера (подход, применяемый в Axis2). CXF также предоставляет встроенный HTTP-сервер Jetty, пригодный для использования в рабочей среде. Он является более гибкой и мощной альтернативой простым серверам HTTP, интегрированным в Axis2 и Metro.

Пример приложения

В разделе загрузки кода представлена версия простого сервиса управления библиотекой, который мы использовали в предыдущих статьях этого цикла. Здесь мы его модифицируем для демонстрации работы с CXF. Как и ранее, WSDL определяет четыре операции:

  • getBook возвращает подробную информацию по книге. Книга идентифицируется по международному стандартному номеру ISBN (International Standard Book Number).
  • getBooksByType возвращает подробную информацию обо всех книгах определенного типа.
  • getTypes возвращает имеющиеся типы книг.
  • addBook добавляет в библиотеку новую книгу.

В статье «JAXB и JAX-WS в Axis2» мы видели, как это приложение работало в Axis2, затем в статье «Introducing Metro», мы рассмотрели его работу в Metro. Большая часть рассуждений, приведенных в предыдущих статьях, также применима и для CXF. Описание WSDL выглядит точно так же, за исключением имени сервиса и адреса конечной точки. Сгенерированная модель данных JAXB тоже такая же. Идентичны даже сгенерированные классы сервиса, за исключением пакета Java и имени сервиса, используемого в аннотациях JAX-WS.

Использование на клиентской стороне

Клиентский код для нашего приложения на CXF идентичен использованию JAX-WS в Axis2 или Metro. Шаги по сборке клиента также очень похожи: используйте входящую в CXF утилиту wsdl2java вместо разработанной для JAX-WS программы wsimport. За подробной информацией о работе с клиентским кодом обращайтесь к статье «JAXB и JAX-WS в Axis2».

Хотя клиентский код одинаков, в поведении клиента CXF имеется существенное отличие. По умолчанию CXF выводит в консоль слишком большое количество информации. CXF использует пакет Java Logging, поэтому, чтобы избавиться от этого, необходимо указать приложению на файл настроек журналирования, сконфигурированный для вывода информации только на уровнях WARNING или SEVERE . В Ant в файле build.xml нашего приложения адрес этого конфигурационного файла указывается с помощью следующего параметра JVM: .

Использование на серверной стороне

Серверный код нашего приложения на CXF также идентичен использованию JAX-WS в Axis2 или Metro. Процесс сборки также очень похож на Metro. В Axis2, мы подготавливали сервис к развертыванию, создавая JAR-файл с классами сервиса и модели данных, а затем разворачивали сервис, помещая этот JAR-файл в директорию WEB-INF/servicejars сервера Axis2. В Metro и CXF вместо этого нужно создать WAR-файл, содержащий классы сервиса и модели данных, библиотечные JAR-файлы Metro или CXF и пару конфигурационных файлов (один из которых называется по разному в этих двух стеках). В файле WEB-INF/web.xml конфигурируется непосредственно обработка запросов сервлетом. В листинге 1 показана версия этого файла, используемая в нашем приложении:

Листинг 1. Файл web.xml в примере приложения

Приведенный в листинге 1 файл WEB-INF/web.xml является всего лишь стандартным конфигурационным файлом сервлета, сообщающим серверу Web-приложений (например Tomcat), как взаимодействовать с сервлетом. Данный файл похож на файл, использованный в примере для Metro, хотя для CXF атрибут является частью кода CXF, а
указывает на класс инфраструктуры Spring (см. Ресурсы). Как и в примере для Metro, сервлет сконфигурирован так, чтобы обрабатывать все запросы, поступающие к данному Web-приложению (это делается в атрибуте / ).

Отдельный файл — WEB-INF/cxf-servlet.xml — используется для настройки в CXF маршрутизации получаемых сервлетом запросов к коду сервиса и задания адреса, по которому можно будет обнаружить WSDL — описание сервиса. Этот файл показан в листинге 2:

Листинг 2. Файл cxf-servlet.xml в примере приложения

В файле WEB-INF/cxf-servlet.xml из листинга 2 определяется одна конечная точка сервиса с классом реализации, шаблоном запросов и местоположением документа WSDL. Адрес документа WSDL является единственной необязательной частью определения конечной точки. Если в файле cxf-servlet.xml не указать для конечной точки сервиса адрес документа WSDL, то CXF автоматически сгенерирует его во время выполнения на основе аннотаций JAX-WS.

Сборка и запуск кода

Проблемы сборки

Начиная с Java SE 6, реализации JAXB 2.x и JAX-WS 2.x (за исключением расширений) стали частью стандартных библиотек Java Runtime Environment (JRE). Это было сделано для поощрения использования этих технологий. Однако у этого благого намерения обнаружилась неприятная оборотная сторона: теперь при необходимости использовать свежие версии данных библиотек необходимо изменять уже установленную JRE.

Файл build.xml, используемый в нашем примере приложения, копирует необходимые CXF JAR-файлы непосредственно в WAR-файл сервиса. В их число входят JAR-файлы JAXB и JAX-WS для сборки на Java SE 5; но когда вы делаете сборку на Java SE 6, процедура сборки будет использовать версии JAXB и JAX-WS из установки JVM. Если конфликты загрузки файлов вызывают проблемы в коде JAXB или JAX-WS при использовании Java SE 6 или более новой версии, проверьте, есть ли к вашему дистрибутиву CXF какие-нибудь замечания о совместимости с различными версиями JVM.

Перед началом работы с примером приложения, вам нужно загрузить и установить себе на систему текущую версию CXF (см. Ресурсы). Код приложения тестировался с версией 2.2.5. Также нужно отредактировать файл build.properties, находящийся в корневом каталоге. Найдите в нем атрибут cxf-home и задайте ему значение пути, по которому установлен CXF. Если вы будете тестировать приложение с сервером, работающем на другой машине, или порту, отличном от стандартного, вам следует изменить атрибуты host-name и host-port .

Чтобы собрать приложение с помощью файла build.xml для Ant, откройте консоль в корневой директории кода приложения и выполните команду ant . Эта команда сначала запускает программу wsdl2java (включенную в дистрибутив CXF), затем скомпилирует код клиента и сервера, и, наконец, упакует код сервера в WAR-архив. Затем можно развернуть сгенерированный файл cxf-library.war на тестовом сервере, и, набрав в консоли ant run , запустить клиент приложения. Клиент выполняет серию запросов к серверу, печатая краткую информацию о результате каждого запроса. Как уже упоминалось в разделе Использование на клиентской стороне, при сборке мы сконфигурировали журналирование CXF так, чтобы избежать вывода детальной информации при запуске клиента.

Spring в CXF

Обратите внимание, что в конфигурационном файле cxf-servlet.xml, указанном в листинге 2, фактически конфигурируется bean-компонент Spring Framework. Как вы, возможно, знаете, Spring — это инфраструктура с открытым исходным кодом для разработки приложений. Она включает в себя множество компонентов и библиотек, которые можно использовать в своем приложении. Изначально в основе Spring лежал контейнер Inversion of Control (IoC). Он позволяет связывать и конфигурировать JavaBean — компоненты, используя механизм отражения Java для доступа к свойствам bean-объектов во время выполнения.

Контейнер Spring IoC, как правило, использует для получения информации о зависимостях XML-файлы. Приведенный в листинге 2 файл cxf-servlet.xml является примером подобного конфигурационного файла Spring. Элемент является всего лишь оболочкой конфигурации конкретного bean-элемента. Элемент является таким bean-элементом, который CXF ассоциирует с определенным типом объектов (экземпляром класса org.apache.cxf.jaxws.EndpointImpl ).

В файле cxf-servlet.xml можно указать множество других параметров, не используемых в этом простом примере, в том числе конфигурацию потока сообщений сервиса. С детальной информацией о конфигурации JAX-WS можно ознакомиться в документации CXF (в разделе Frontends/JAX-WS).

За исключением аннотаций JAX-WS, Spring используется для всей конфигурации стека CXF, в том числе для организации работы внутренних сообщений CXF. В большинстве случаев все детали настройки обрабатываются автоматически, с помощью конфигурационных XML-файлов, включенных непосредственно в CXF (в параметре contextConfigLocation в файле web.xml из листинга 1, можно увидеть, как именно эти файлы указываются). Однако типичную конфигурацию можно переопределить или расширить, используя свои собственные конфигурационные файлы. Мы не будем рассказывать об этом в данном цикле статей, за подробной информацией по этой теме обращайтесь к документации CXF.

Продолжим знакомство с CXF

В данной статье мы познакомились с основами работы со стеком Web-сервисов CXF, а именно с использованием связывания с данными JAXB 2.x и основанной на аннотациях конфигурации JAX-WS 2.x. Код для JAXB/JAX-WS, использованный ранее в статьях, посвященных Axis2 и Metro, также работает и в CXF. Мы сделали лишь несколько незначительных изменений в настройках сборки и использовали другой файл развертывания и конфигурации. Такая совместимость является главным преимуществом использования JAXB и JAX-WS, так как она облегчает переключение между стеками.

В CXF имеется множество возможностей, не раскрытых в этом простом примере, и в следующих статьях мы расскажем о некоторых из них. В следующей статье мы рассмотрим использование WS-Security, и сравним реализацию этой технологии в CXF с реализациями в Axis2 и Metro.

Ссылка на основную публикацию
Adblock
detector