• springboot1.5.4 集成cxf完整实例


    WebService 服务端

    添加依赖

    <?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>cn.xiaojf.temple</groupId>
        <artifactId>netbar-ws</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <repositories>
            <repository>
                <id>nexus-aliyun</id>
                <name>Nexus aliyun</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public</url>
            </repository>
        </repositories>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.4.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
                <scope>true</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
                <version>3.1.12</version>
            </dependency>
        </dependencies>
    
    </project>

     application.properties

    #应用端口号
    server.port=8002
    #自定义log规则
    logging.config=classpath:logback-boot.xml

    服务接口

    package cn.xiaojf.temple.netbar.service;
    
    import javax.jws.WebMethod;
    import javax.jws.WebParam;
    import javax.jws.WebService;
    
    /**
     * 网吧web services 接口
     * @author xiaojf 2017/7/24 21:35
     */
    @WebService(targetNamespace = "http://service.netbar.temple.xiaojf.cn")// 命名空间,一般是接口的包名倒序
    public interface NetbarServices {
        @WebMethod
        String sayHello(@WebParam(name = "userName") String name);
    }

    服务接口实现

    package cn.xiaojf.temple.netbar.service;
    
    import org.springframework.stereotype.Component;
    
    import javax.jws.WebService;
    
    /**
     *  网吧web services 接口实现
     * @author xiaojf 2017/7/24 21:38
     */
    @WebService(serviceName = "NetbarServices"//服务名
            ,targetNamespace = "http://service.netbar.temple.xiaojf.cn"//报名倒叙,并且和接口定义保持一致
            ,endpointInterface = "cn.xiaojf.temple.netbar.service.NetbarServices")//包名
    @Component
    public class NetbarServicesImpl implements NetbarServices {
        @Override
        public String sayHello(String name) {
            return "hello , "+ name;
        }
    }

    发布服务

    package cn.xiaojf.temple.netbar.service.conf;
    
    import cn.xiaojf.temple.netbar.service.NetbarServices;
    import org.apache.cxf.Bus;
    import org.apache.cxf.jaxws.EndpointImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.xml.ws.Endpoint;
    
    @Configuration
    public class CxfConfig {
        @Autowired
        private Bus bus;
        @Autowired
        private NetbarServices netbarServices;
    
        @Bean
        public Endpoint endpoint() {
            EndpointImpl endpoint = new EndpointImpl(bus,netbarServices);
            endpoint.publish("/NetbarServices");//接口发布在 /NetbarServices 目录下
            return endpoint;
        }
    }

    验证

    http://localhost:8002/services/NetbarServices?wsdl
    <wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://service.netbar.temple.xiaojf.cn" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="NetbarServices" targetNamespace="http://service.netbar.temple.xiaojf.cn">
    <wsdl:types>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://service.netbar.temple.xiaojf.cn" elementFormDefault="unqualified" targetNamespace="http://service.netbar.temple.xiaojf.cn" version="1.0">
    <xs:element name="sayHello" type="tns:sayHello"/>
    <xs:element name="sayHelloResponse" type="tns:sayHelloResponse"/>
    <xs:complexType name="sayHello">
    <xs:sequence>
    <xs:element minOccurs="0" name="userName" type="xs:string"/>
    </xs:sequence>
    </xs:complexType>
    <xs:complexType name="sayHelloResponse">
    <xs:sequence>
    <xs:element minOccurs="0" name="return" type="xs:string"/>
    </xs:sequence>
    </xs:complexType>
    </xs:schema>
    </wsdl:types>
    <wsdl:message name="sayHello">
    <wsdl:part element="tns:sayHello" name="parameters"></wsdl:part>
    </wsdl:message>
    <wsdl:message name="sayHelloResponse">
    <wsdl:part element="tns:sayHelloResponse" name="parameters"></wsdl:part>
    </wsdl:message>
    <wsdl:portType name="NetbarServices">
    <wsdl:operation name="sayHello">
    <wsdl:input message="tns:sayHello" name="sayHello"></wsdl:input>
    <wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse"></wsdl:output>
    </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="NetbarServicesSoapBinding" type="tns:NetbarServices">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="sayHello">
    <soap:operation soapAction="" style="document"/>
    <wsdl:input name="sayHello">
    <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output name="sayHelloResponse">
    <soap:body use="literal"/>
    </wsdl:output>
    </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="NetbarServices">
    <wsdl:port binding="tns:NetbarServicesSoapBinding" name="NetbarServicesImplPort">
    <soap:address location="http://localhost:8002/services/NetbarServices"/>
    </wsdl:port>
    </wsdl:service>
    </wsdl:definitions>

    WebService 客户端

    添加依赖

    <?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>cn.xiaojf.temple</groupId>
        <artifactId>netbar</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <repositories>
            <repository>
                <id>nexus-aliyun</id>
                <name>Nexus aliyun</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public</url>
            </repository>
        </repositories>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.4.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
                <scope>true</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-freemarker</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
                <version>3.1.12</version>
            </dependency>
        </dependencies>
    
    </project>

    测试代码

    package test.ws;
    
    import org.apache.cxf.endpoint.Client;
    import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
    import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
    import org.junit.Test;
    
    /**
     * 测试网吧接口
     * @author xiaojf 2017/7/24 22:01
     */
    public class NetBarServicesTest {
        /**
         * 方式1.代理类工厂的方式,需要拿到对方的接口
         */
        /*@Test
        public void cl1() {
            try {
                // 接口地址
                String address = "http://localhost:8080/services/CommonService?wsdl";
                // 代理工厂
                JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
                // 设置代理地址
                jaxWsProxyFactoryBean.setAddress(address);
                // 设置接口类型
                jaxWsProxyFactoryBean.setServiceClass(CommonService.class);
                // 创建一个代理接口实现
                CommonService cs = (CommonService) jaxWsProxyFactoryBean.create();
                // 数据准备
                String userName = "Leftso";
                // 调用代理接口的方法调用并返回结果
                String result = cs.sayHello(userName);
                System.out.println("返回结果:" + result);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }*/
    
        /**
         * 动态调用方式
         */
        @Test
        public void cl2() {
            // 创建动态客户端
            JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
            Client client = dcf.createClient("http://localhost:8002/services/NetbarServices?wsdl");
            // 需要密码的情况需要加上用户名和密码
            // client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,
            // PASS_WORD));
            Object[] objects = new Object[0];
            try {
                // invoke("方法名",参数1,参数2,参数3....);
                objects = client.invoke("sayHello", "Leftso");
                System.out.println("返回数据:" + objects[0]);
            } catch (java.lang.Exception e) {
                e.printStackTrace();
            }
        }
    }

    效果验证

    22:17:45.956 [main] DEBUG org.apache.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor@22c01ab0
    22:17:45.956 [main] DEBUG org.apache.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.binding.soap.interceptor.SoapActionInInterceptor@2a492f2a
    22:17:45.956 [main] DEBUG org.apache.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.binding.soap.interceptor.StartBodyInterceptor@411341bd
    22:17:45.956 [main] DEBUG org.apache.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.binding.soap.interceptor.MustUnderstandInterceptor@5400db36
    22:17:45.956 [main] DEBUG org.apache.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor@4c4d362a
    22:17:45.956 [main] DEBUG org.apache.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.wsdl.interceptors.DocLiteralInInterceptor@3277e499
    22:17:45.972 [main] DEBUG org.apache.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.binding.soap.interceptor.SoapHeaderInterceptor@585811a4
    22:17:45.972 [main] DEBUG org.apache.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.jaxws.interceptors.WrapperClassInInterceptor@641856
    22:17:45.972 [main] DEBUG org.apache.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.interceptor.StaxInEndingInterceptor@4b4dd216
    22:17:45.987 [main] DEBUG org.apache.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.jaxws.interceptors.SwAInInterceptor@2f66e802
    22:17:45.987 [main] DEBUG org.apache.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.jaxws.interceptors.HolderInInterceptor@1b58ff9e
    22:17:45.987 [main] DEBUG org.apache.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.ws.policy.PolicyVerificationInInterceptor@7fe083b1
    22:17:45.987 [main] DEBUG org.apache.cxf.ws.policy.PolicyVerificationInInterceptor - Verified policies for inbound message.
    返回数据:hello , Leftso
  • 相关阅读:
    php防止用户输入进行跨站攻击的方式
    php中相关函数
    php运算符
    php中error_reporting
    php环境的安装
    LAMP环境介绍
    js的StringBuffer类
    一个带关闭按钮的Div窗口,很漂亮
    js  计算是今天多少周
    java 递归
  • 原文地址:https://www.cnblogs.com/xiaojf/p/7231529.html
Copyright © 2020-2023  润新知