В этом приложении JAX-WS мы будем использовать подход Apache CXF-first, как и в предыдущем приложении POJO. Итак, сначала мы создадим интерфейс для нашего веб-сервиса.
Объявление сервисного интерфейса
Как и в предыдущем случае, мы создадим тривиальный сервис, который имеет только один интерфейсный метод, называемый приветствиями. Код для интерфейса службы показан ниже —
//HelloWorld.java package com.tutorialspoint.cxf.jaxws.helloworld; import javax.jws.WebService; @WebService public interface HelloWorld { String greetings(String text); }
Мы аннотируем интерфейс тегом @WebService . Далее мы реализуем этот интерфейс.
Реализация веб-интерфейса
Реализация веб-интерфейса показана здесь —
//HelloWorldImpl.java package com.tutorialspoint.cxf.jaxws.helloworld; public class HelloWorldImpl implements HelloWorld { @Override public String greetings(String name) { return ("hi " + name); } }
Метод приветствия помечен тегом @Override . Метод возвращает сообщение «привет» вызывающей стороне.
Далее мы напишем код для разработки сервера.
Развивающийся сервер
В отличие от приложения POJO, теперь мы будем отделять интерфейс, используя класс Endpoint, предоставленный CXF, для публикации нашего сервиса. Это делается в следующих двух строках кода:
HelloWorld implementor = new HelloWorldImpl(); Endpoint.publish( "http://localhost:9090/HelloServerPort", implementor, new LoggingFeature() );
Первый параметр метода публикации указывает URL-адрес, по которому наша служба будет доступна для клиентов. Второй параметр указывает класс реализации для нашего сервиса. Весь код для сервера показан ниже —
//Server.java package com.tutorialspoint.cxf.jaxws.helloworld; import javax.xml.ws.Endpoint; import org.apache.cxf.ext.logging.LoggingFeature; public class Server { public static void main(String[] args) throws Exception { HelloWorld implementor = new HelloWorldImpl(); Endpoint.publish("http://localhost:9090/HelloServerPort", implementor, new LoggingFeature()); System.out.println("Server ready..."); Thread.sleep(5 * 60 * 1000); System.out.println("Server exiting ..."); System.exit(0); } }
Чтобы развернуть наш сервер, вам нужно будет внести еще несколько изменений в ваш проект, как указано ниже.
Развертывание Сервера
Наконец, чтобы развернуть серверное приложение, вам нужно будет сделать еще одну модификацию в pom.xml, чтобы настроить приложение как веб-приложение. Код, который вам нужно добавить в ваш pom.xml , приведен ниже —
<profiles> <profile> <id>server</id> <build> <defaultGoal>test</defaultGoal> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.6.0</version> <executions> <execution> <phase>test</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass> com.tutorialspoint.cxf.jaxws.helloworld.Server </mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
Перед развертыванием приложения необходимо добавить еще два файла в ваш проект. Это показано на скриншоте ниже —
Эти файлы являются стандартными файлами CXF, которые определяют отображение для CXFServlet . Код в файле web.xml показан здесь для вашего быстрого ознакомления —
//Web.xml <?xml version = "1.0" encoding = "UTF-8"??> <web-app xmlns = "http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>cxf</display-name> <servlet> <description>Apache CXF Endpoint</description> <display-name>cxf</display-name> <servlet-name>cxf</servlet-name> <servlet-class> org.apache.cxf.transport.servlet.CXFServlet </servlet-class> <load-on-startup> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-name> cxf </servlet-name> <url-pattern> /services/* </url-pattern> </servlet-mapping> <session-config> <session-timeout>60</session-timeout> </session-config> </web-app>
В файле cxf-servlet.xml вы объявляете свойства конечной точки вашего сервиса. Это показано во фрагменте кода ниже —
<beans ...> <jaxws:endpoint xmlns:helloworld = "http://tutorialspoint.com/" id = "helloHTTP" address = "http://localhost:9090/HelloServerPort" serviceName = "helloworld:HelloServiceService" endpointName = "helloworld:HelloServicePort"> </jaxws:endpoint> </beans>
Здесь мы определяем идентификатор нашей конечной точки службы, адрес, по которому служба будет доступна, имя службы и имя конечной точки. Теперь вы узнали, как ваш сервис маршрутизируется и обрабатывается CXF-сервлетом.
Финал pom.xml
Pom.xml включает в себя еще несколько зависимостей. Вместо того, чтобы описывать все зависимости, мы включили финальную версию pom.xml ниже —
<?xml version = "1.0" encoding = "UTF-8"??> <project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.tutorialspoint</groupId> <artifactId>cxf-jaxws</artifactId> <version>1.0</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <profiles> <profile> <id>server</id> <build> <defaultGoal>test</defaultGoal> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.6.0</version> <executions> <execution> <phase>test</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass> com.tutorialspoint.cxf.jaxws.helloworld.Server </mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> <profile> <id>client</id> <build> <defaultGoal>test</defaultGoal> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <executions> <execution> <phase>test</phase> <goals> <goal>java</goal> <goals> <configuration> <mainClass> com.tutorialspoint.cxf.jaxws.helloworld.Client </mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> <dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-features-logging</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>3.3.0</version> </dependency> </dependencies> </project>
Обратите внимание, что он также включает профиль для построения клиента, который мы изучим в последующих разделах этого руководства.
Запуск службы HelloWorld
Теперь вы готовы запустить веб-приложение. В командном окне запустите скрипт сборки, используя следующую команду.
mvn clean install
mvn -Pserver
Вы увидите следующее сообщение на консоли —
INFO: Setting the server's publish address to be http://localhost:9090/HelloServerPort Server ready…
Как и раньше, вы можете протестировать сервер, открыв URL-адрес сервера в браузере.
Поскольку мы не указали никакой операции, наше приложение возвращает браузеру только сообщение об ошибке.
Теперь попробуйте добавить ? Wsdl в ваш URL, и вы увидите следующий результат:
Итак, наше серверное приложение работает, как и ожидалось. Вы можете использовать клиент SOAP, такой как Postman, описанный ранее, для дальнейшего тестирования вашего сервиса.
В следующем разделе мы узнаем, как написать клиент, который использует наш сервис.
Развивающийся клиент
Написание клиента в приложении CXF столь же тривиально, как написание сервера. Вот полный код для клиента —
//Client.java package com.tutorialspoint.cxf.jaxws.helloworld; import javax.xml.namespace.QName; import javax.xml.ws.Service; import javax.xml.ws.soap.SOAPBinding; public final class Client { private static final QName SERVICE_NAME = new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/", "HelloWorld"); private static final QName PORT_NAME = new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/", "HelloWorldPort"); private Client() { } public static void main(String[] args) throws Exception { Service service = Service.create(SERVICE_NAME); System.out.println("service created"); String endpointAddress = "http://localhost:9090/HelloServerPort"; service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress); HelloWorld hw = service.getPort(HelloWorld.class); System.out.println(hw.greetings("World")); } }
Здесь мы используем предоставляемый CXF класс Service для привязки к известному сервису. Мы вызываем метод create для класса Service, чтобы получить экземпляр сервиса. Мы устанавливаем известный порт, вызывая метод addPort в экземпляре службы .
Теперь мы готовы использовать службу, что мы и делаем, сначала получая интерфейс службы, вызывая метод getPort в экземпляре службы . Наконец, мы вызываем наш метод приветствия, чтобы напечатать сообщение приветствия на консоли.
Теперь, когда вы изучили основы CXF с использованием подхода Apache CXF-First, теперь вы узнаете, как использовать CXF с подходом WSDL-First в нашей следующей главе.