CXF+SpringBoot webservice

来源:互联网 发布:linux内网通外网不通 编辑:程序博客网 时间:2024/05/01 22:06

CXF+SpringBoot webservice

  • CXFSpringBoot webservice
    • 简介
    • 服务端编写
      • 使用jdk自带的工具wsgen生成wsdl和xsd文件不是必要可跳过
    • 发布服务端
    • 使用jdk wsimport工具生成客户端
    • 调用客户端测试

简介

本文源码:https://github.com/zhangchuanben/ws.git
引用地址,这篇文章介绍了一些webservice的基础,以及我们应如何去编写一个webservice。本人也是初学者,如果有不合适的地方还望指正。
写一个webservice有两种方式

wsdl优先,从wsdl文件开始编写,然后生成服务端代码

代码优先,从java代码开始编写,然后生成相应的wsdl文件

wsdl优先比较困难,因为我们必须对wsdl的定义以及xsd文件都比较熟悉,所以本文基于代码优先

服务端编写

package com.ws;import javax.jws.WebMethod;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;import javax.jws.soap.SOAPBinding.ParameterStyle;import javax.jws.soap.SOAPBinding.Style;import javax.jws.soap.SOAPBinding.Use;@WebService(serviceName="OrderProcess", portName="OrderProcessPort",        targetNamespace="http://www.ben.com/orderprocess")@SOAPBinding(style=Style.RPC,use=Use.LITERAL,        parameterStyle=ParameterStyle.WRAPPED)public class OrderProcessService {    @WebMethod    public Response processOrder(OrderBean orderBean) {        System.out.println("传过来数据:"+orderBean.toString());        Response rs = new Response();        rs.setData("返回数据");        rs.setOrderId("xxxsdfsdfsd");        return rs;    }}

这段代码采用JAX-WS声明了一个webservice服务端。但是要注意@SOAPBinding这个注解,它的Style属性有效值为Style.RPC和Style.DOCUMENT,当我选择style=Style.DOCUMENT时,生成客户端是有问题的,生成的客户端方法没有返回值,这显然与我服务端的定义是不符的,但是用SoapUi测试却是能通过的。
还有一点需要注意,@SOAPBinding的parameterStyle属性,它的有效值为ParameterStyle.BARE和ParameterStyle.WRAPPED,当我设置parameterStyle=ParameterStyle.WRAPPED生成客户端时会将入参和返回值进行包装。

使用jdk自带的工具wsgen生成wsdl和xsd文件(不是必要,可跳过)

打开控制台输入:

wsgen

如果正确配置了java的jdk环境应该可以看到类似信息
wsgen使用说明
在编译路径(\target\classes 目录)初打开cmd,输入:

wsgen -cp . com.ws.OrderProcessService -keep -wsdl

这里写图片描述
ok,你可以在当前目录下看到三个文件:
这里写图片描述
如果想使用可以将生成的文件复制到资源目录(maven项目下的src/main/resources)

发布服务端

服务端的发布有很多种方法,例如JAX-WS的

public class OrderWebServicePublisher {    public static void main(String[] args) {        Endpoint.publish("http://localhost:8080/OrderProcessWeb/orderprocess",                new OrderProcessService());    }}

而我采用的是springboot+cxf,具体发布代码为:

package com.ws;import javax.xml.ws.Endpoint;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;@Configurationpublic class WebserviceConfig {    @Autowired    private Bus bus;    @Bean    public Endpoint endpoint() {        EndpointImpl endpoint = new EndpointImpl(bus, new OrderProcessService());        endpoint.publish("/orderprocess");        return endpoint;    }}

因为cxf starter 默认地址为/services/发布的服务名称,所以访问地址为:

http://localhost:8080/services/orderprocess?wsdl

如果想了解更多cxf starter的用法建议参照:
cxf+springboot
如果浏览器显示如下信息,恭喜服务端已经搭建好了。你可以用SoapUi进行测试
这里写图片描述

使用jdk wsimport工具生成客户端

打开控制台输入:

wsimport

如果正确配置了java的jdk环境应该可以看到类似信息
wsimport说明
在编译路径(\target\classes 目录)初打开cmd,输入:

wsimport -d . -p com.ws.client http://localhost:8080/services/orderprocess?wsdl -keep -encoding utf-8

如果在./com/ws/client/目录下看到这里写图片描述
则说明生成客户端成功了,将客户端的源文件保存到自己需要的位置

调用客户端测试

package com.ws;import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;import org.springframework.test.context.junit4.SpringRunner;import com.ws.client.OrderBean;import com.ws.client.OrderProcessService;@RunWith(SpringRunner.class)@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)public class ApplicationTest {    @Test    public void testClient() {        JaxWsProxyFactoryBean soapFactoryBean = new JaxWsProxyFactoryBean();        soapFactoryBean.setAddress("http://localhost:8080/services/orderprocess?wsdl");        soapFactoryBean.setServiceClass(OrderProcessService.class);        OrderProcessService service = (OrderProcessService) soapFactoryBean.create();        OrderBean order = new OrderBean();        order.setData("客户端发送数据");        com.ws.client.Response rs = service.processOrder(order);        System.out.println(rs.getData());        System.out.println("调用完成");    }}

有一点需要注意如果生成的客户端OrderProcessService.java并不是类似于

package com.ws.client;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;import javax.xml.bind.annotation.XmlSeeAlso;/** * This class was generated by the JAX-WS RI. * JAX-WS RI 2.2.9-b130926.1035 * Generated source version: 2.2 *  */@WebService(name = "OrderProcessService", targetNamespace = "http://www.ben.com/orderprocess")@SOAPBinding(style = SOAPBinding.Style.RPC)@XmlSeeAlso({    ObjectFactory.class})public interface OrderProcessService {    /**     *      * @param arg0     * @return     *     returns com.ws.client.Response     */    @WebMethod    @WebResult(partName = "return")    public Response processOrder(        @WebParam(name = "arg0", partName = "arg0")        OrderBean arg0);}

请检查服务端的配置

0 0
原创粉丝点击