Как быстро реализовать WebService с помощью Apache CXF

Java

В процессе перехода от единой архитектуры к распределенной архитектуре межпроцессное взаимодействие стало жестким требованием.Если для прямого взаимодействия используется сокет, это очень усложнит программирование.

В 1984 году Брюс Джей Нельсон предложилМежпроцессное взаимодействиестандартный, который мы обычно называем RPC (удаленный вызов процедур). Все последующие фреймворки RPC разрабатываются на основе этого стандарта.

Концепция RPC на самом деле очень проста.Когда клиент хочет инициировать вызов, он на самом деле через заглушку локального вызывающего абонента (который можно понимать как интерфейс), эта заглушка будет кодировать методы и параметры, которые нужны клиенту выполняться по согласованному протоколу, затем по сети передается на сервер, после получения информации сервер выполняет настоящий метод, а затем передает результат клиенту по сети.

Введение в веб-сервисы

Web ServicesТип RPC. Использование веб-службSOAPВ качестве транспортного протокола используйтеWSDLВ качестве языка описания служб используйте UDDI для обнаружения регистрации служб (хотя и не разработанный).

Хотя соответствующие протоколы веб-служб не обновлялись с 2007 года, веб-службы по-прежнему широко используются в некоторых финансовых учреждениях, таких как банки.

Существует множество фреймворков WebService, таких как Axis2, XFire, CXF и так далее.

Apache Cxf — один из лучших и наиболее важных, а инфраструктура CXF — это не просто инфраструктура веб-служб, она даже может реализовывать службы RESTful через CXF.

CXF реализует простой веб-сервис

Реализация веб-сервисов с помощью CXF очень проста.

Полная служба веб-служб делится на серверную часть и серверную часть.Давайте сначала посмотрим на реализацию кода серверной части.

Сначала создайте проект Maven и введите следующие зависимости в pom.xml:

<dependency>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-rt-frontend-jaxws</artifactId>
  <version>3.4.0-SNAPSHOT</version>
</dependency>
<dependency>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-rt-transports-http</artifactId>
  <version>3.4.0-SNAPSHOT</version>
</dependency>
<dependency>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-rt-transports-http-jetty</artifactId>
  <version>3.4.0-SNAPSHOT</version>
</dependency>

Затем вы можете начать писать код.Во-первых, вам нужно определить API-интерфейс, который можно открыть:

import javax.jws.WebService;

@WebService
public interface CxfDemoService {
    String hello(String name);
}

@WebServiceВ аннотации указано, что это внешний интерфейс. Затем вам нужно реализовать конкретную бизнес-логику:

public class CxfDemoServiceImpl implements CxfDemoService{
    @Override
    public String hello(String name) {
        return "hello " + name;
    }
}

Как и в реализации обычного класса, в этом нет ничего особенного. Затем создайте службу:

CxfDemoServiceImpl implementor = new CxfDemoServiceImpl();
JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();
svrFactory.setServiceClass(CxfDemoService.class);
svrFactory.setAddress("http://localhost:9000/cxfDemoService");
svrFactory.setServiceBean(implementor);
svrFactory.create();

Код тоже очень простой, мы устанавливаем адрес сервиса вhttp://localhost:9000/cxfDemoService, если номера портов не конфликтуют, этот адрес можно определить по мере необходимости. Это все, что касается серверного кода, просто поместите этот код в основной метод и запустите его.

Выше мы упоминали, что веб-сервисы используют WSDL в качестве языка описания сервисов, как вы это понимаете? Написанный сервис должен вызываться другими, поэтому другие должны знать, какие параметры нужны этому интерфейсу и каков возвращаемый результат.http://localhost:9000/cxfDemoService?wsdl, добавьте ?wsdl после адреса службы, и возвращенный результат будет следующим:

<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://cxf.rayjun.cn/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="CxfDemoServiceService" targetNamespace="http://cxf.rayjun.cn/">
    <wsdl:types>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://cxf.rayjun.cn/" elementFormDefault="unqualified" targetNamespace="http://cxf.rayjun.cn/" version="1.0">
            <xs:element name="hello" type="tns:hello"/>
            <xs:element name="helloResponse" type="tns:helloResponse"/>
            <xs:complexType name="hello">
                <xs:sequence>
                    <xs:element minOccurs="0" name="arg0" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
            <xs:complexType name="helloResponse">
                <xs:sequence>
                    <xs:element minOccurs="0" name="return" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="helloResponse">
        <wsdl:part element="tns:helloResponse" name="parameters"> </wsdl:part>
    </wsdl:message>
    <wsdl:message name="hello">
        <wsdl:part element="tns:hello" name="parameters"> </wsdl:part>
    </wsdl:message>
    <wsdl:portType name="CxfDemoService">
        <wsdl:operation name="hello">
            <wsdl:input message="tns:hello" name="hello"> </wsdl:input>
            <wsdl:output message="tns:helloResponse" name="helloResponse"> </wsdl:output>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="CxfDemoServiceServiceSoapBinding" type="tns:CxfDemoService">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="hello">
            <soap:operation soapAction="" style="document"/>
            <wsdl:input name="hello">
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output name="helloResponse">
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="CxfDemoServiceService">
        <wsdl:port binding="tns:CxfDemoServiceServiceSoapBinding" name="CxfDemoServicePort">
            <soap:address location="http://localhost:9000/cxfDemoService"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

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

На данный момент написан серверный код, затем нужно написать клиентский код, а клиентский код тоже очень прост:

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(CxfDemoService.class);
factory.setAddress("http://localhost:8080/CxfDemoService");
CxfDemoService client = (CxfDemoService) factory.create();
String reply = client.hello("Rayjun");
System.out.println("Server : " + reply); // Server: hello rayjun

Приведенный выше код прост и груб. Если вы разработаете его напрямую, код легко станет сложным в обслуживании. Использование Spring для организации кода может легко решить эту проблему.

Интеграция CXF с Spring

CXF можно легко соединить с Spring, просто импортируйте следующие зависимости Spring:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>5.2.5.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.5.RELEASE</version>
</dependency>

Затем создайте файл конфигурации для контейнера Spring:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xsi:schemaLocation=" http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
    
    <jaxws:endpoint id="rmsEngineService" implementor="cn.rayjun.cxf.CxfDemoServiceImpl" address="/CxfDemoService"/>
</beans>

Используйте файл конфигурации CXF по умолчанию непосредственно в файле конфигурации и используйтеjaxwsдля определения интерфейса службы. JAX-WS — это реализация веб-служб в J2EE.JAX-RS также является частью веб-служб J2EE и представляет собой RESTful API.Здесь мы используем JAX-WS.

И добавьте файл конфигурации в web.xml:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

Затем вы можете упаковать программу в веб-контейнер.Если это удобно для тестирования, вы также можете напрямую использовать подключаемый модуль причала maven для непосредственного запуска проекта.Конфигурация подключаемого модуля причала выглядит следующим образом:

<plugin>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId>
  <version>9.4.29.v20200521</version>
  <configuration>
    <scanIntervalSeconds>10</scanIntervalSeconds>
    <war>${project.basedir}/target/cxfdemo.war</war>
    <webApp>
      <contextPath>/</contextPath>
    </webApp>
    <httpConnector>
      <port>8080</port>
    </httpConnector>
  </configuration>
</plugin>

затем используйтеmvn jetty:run-war, сервер работает, и код клиента не нужно менять, чтобы легко получить доступ к сервису.

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

Обратите внимание на публичный аккаунт WeChat, пообщайтесь о других