webservice 实例 创建与 调用「建议收藏」

webservice 实例 创建与 调用「建议收藏」webservice实例创建与调用序webservice选型配置代码webservice接口层接口实现实体webservice挂靠配置启动服务测试服务测试:测试地址客户端生成环境配置代码生成序对接SAP系统,指定要用webservice做对接。不然打死也不用webservice,感觉webService也实现不怎么流行了,过程中遇到了不少问题。就javawebservice而言,框架就有不下十种。网上的教程更是五花八门,零零碎碎,并且很多误导。本博将记录下项目里用的webservi

大家好,又见面了,我是你们的朋友全栈君。

对接SAP系统,指定要用webservice 做对接。不然打死也不用webservice,webService也不怎么流行了,有更好的选择。
就java webservice而言,框架就有不下十种。网上的教程更是五花八门,零零碎碎,并且很多误导。 本博将记录下项目里用的webservice,以及调用全过程,不误导。

webservice 选型

试用了几种,最终选型CXF,这里不做横向对比了。用它的原因很简单
1: CXF顺利跑起来了,很顺。
2: 跟spring boot 配合得比较好,无需要启用新的端口(放在restful api 项目,并共用一端口)。

配置

Gradle 配置,maven自行转换。

compile("org.apache.cxf:cxf-spring-boot-starter-jaxws:3.2.8")

引进来之后下载了一大堆东西,如下
在这里插入图片描述
PS: 版本真心是难搞,需要耐心的去试配置,我的jdk是 1.8.0_144 ,Spring boot 版本为 2.0.4.RELEASE

代码

webservice 接口层

package com.ly.mp.swcas.main.webService;

import com.ly.mp.common.entities.RestResult;
import com.ly.mp.swcas.main.wrap.*;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import java.util.List;

@WebService(name = "SwcasService"// 暴露服务名称

)
public interface SwcasService { 
   
    @WebMethod
    @WebResult(name = "String", targetNamespace = "")
    public String sayHello(@WebParam(name = "userName") String name);

    @WebMethod
    @WebResult(name = "WsResult", targetNamespace = "")
    public WsResult sayHello2(@WebParam(name = "userName") String name);
}

关键 1: 注解服务名称,这个服务名称将会是webservice 地址的一部分。如 http://localhost:10034/services/SwcasService?wsdl

@WebService(name = "SwcasService"// 暴露服务名称

关键 2: webservice 方法注解,包括方法以及结果返回注解。

 @WebMethod
 @WebResult(name = "WsResult", targetNamespace = "")

接口实现

package com.ly.mp.swcas.main.webService;

import javax.jws.WebService;

import com.ly.mp.common.entities.RestResult;
import com.ly.mp.component.entities.UserEntity;
import com.ly.mp.swcas.main.entities.*;
import com.ly.mp.swcas.main.ibiz.*;
import com.ly.mp.swcas.main.wrap.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

@WebService(serviceName = "SwcasService")
@Component
public class SwcasServiceImp implements SwcasService { 
   

    @Autowired
    private ICarConfigBiz carConfigBiz;

    @Autowired
    private IDealerBiz dealerBiz;

    @Autowired
    private IVehicleDespatchBiz vehicleDespatchBiz;

    @Autowired
    private ISupplierBiz supplierBiz;

    @Autowired
    private IPartBiz partBiz;
    @Override
    public String sayHello(String name) { 
   
        return "Hello ," + name;
    }

    @Override
    public WsResult sayHello2(String name) { 
   

        WsResult rs= new WsResult(1,"成功");
        rs.setMsg("测试成功");
        rs.setResult(1);

        WsResultItem resultItem =new WsResultItem("abc",1,"成功");
        rs.getData().add(resultItem);
        return rs;
    }

关键1: 类需要加上组件注解,

@Component

实体

WsResult

package com.ly.mp.swcas.main.webService;



import java.util.ArrayList;
import java.util.List;

public class WsResult { 
   

    private  int result;
    private String msg ;
    private List<WsResultItem> data ;


    { 
   
        data =new ArrayList<>();
    }


    public WsResult(int result, String msg) { 
   
        this.result = result;
        this.msg = msg;
    }

    public int getResult() { 
   
        return result;
    }

    public void setResult(int result) { 
   
        this.result = result;
    }

    public String getMsg() { 
   
        return msg;
    }

    public void setMsg(String msg) { 
   
        this.msg = msg;
    }

    public List<WsResultItem> getData() { 
   
        return data;
    }

    public void setData(List<WsResultItem> data) { 
   
        this.data = data;
    }

}

WsResultItem

package com.ly.mp.swcas.main.webService;



public class WsResultItem { 
   

    private  String Key;
    private  int Result;
    private  String Msg;

    public WsResultItem(String key, int result, String msg) { 
   
        Key = key;
        Result = result;
        Msg = msg;
    }

    public String getKey() { 
   
        return Key;
    }

    public void setKey(String key) { 
   
        Key = key;
    }

    public int getResult() { 
   
        return Result;
    }

    public void setResult(int result) { 
   
        Result = result;
    }

    public String getMsg() { 
   
        return Msg;
    }

    public void setMsg(String msg) { 
   
        Msg = msg;
    }
}

PS: 与SAP对接主要是同步业务数据,一次同步可能是多条,每第业务数据都带有唯一的key,我们这边返回值 需要返回对应key以及处理状态。

webservice 挂靠配置

package com.ly.mp.swcas.main.config;

import javax.xml.ws.Endpoint;

import com.ly.mp.swcas.main.webService.SwcasService;
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;


@Configuration
public class CxfConfig { 
   
    @Autowired
    private Bus bus;

    @Autowired
    SwcasService swcasService;

    /** JAX-WS **/
    @Bean
    public Endpoint endpoint() { 
   
        EndpointImpl endpoint = new EndpointImpl(bus, swcasService);
        endpoint.publish("/SwcasService"); 
        
        System.out.println("---------------服务发布------------------");
        return endpoint;
    }
}

启动服务测试

1:输出日志里带有服务发布的字眼。

在这里插入图片描述
2:服务启动成功信息在这里插入图片描述

服务测试:

测试地址

根据服务启动的信息可以知道,我们端口号是10034。
本地webservice 的地址是 :http://localhost:10034/services/SwcasService
webservice 文档:http://localhost:10034/services/SwcasService?wsdl

如下图所示:
在这里插入图片描述
PS:前面的代码我做了脱敏,这个截图实现上把未脱敏的方法都显示出来了,不要见怪。。

客户端生成

因为考虑到服务的复杂性,测试起来相当麻烦。建议使用生成客户端代码。
我使用的是 idea 工具。

环境配置

在这里插入图片描述
CXF官方下载地址:http://cxf.apache.org/download.html,上面有各种版本。看发布说明下载。
PS :我试过用最新的版本,无法使用。建议使用3.2.13版本 https://www.apache.org/dyn/closer.lua/cxf/3.2.13/apache-cxf-3.2.13.zip

代码生成

第一步:
(idea 2020开发工具) tools/WebServices/Generate Java Code From Wsdl。如下图一
idea 2018 工发工具) 项目文件右击,弹出菜单。如下图二

在这里插入图片描述
在这里插入图片描述

第二步
服务平台选择CXF,配置好之后点击【OK】按钮。
在这里插入图片描述
第三步生成效果如下图所示。
在这里插入图片描述
第四步:找到测试入口文件,如下所示。运行。
在这里插入图片描述

第五步:遇到问题,生成的代码文件编码不对。

在这里插入图片描述
第六步:代码文档转格式

在这里插入图片描述
在这里插入图片描述
PS:文件可能比较多,一个一个点吧,我的接口比较多,点了20次左右。。

第七步:重复第五步运行,看到输出结果了,大功告成,如果对你有帮助就点个赞吧

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162666.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • jquery获取iframe的src(input标签type属性有哪些)

    一句搞定,不搞那些花里胡哨的$(‘#InformationURL’).attr(‘src’,’https://www.baidu.com’);//#InformationURL:iframe的id=”InformationURL”,注意这里的#是后加上的//这里将src设置为百度,当然你也可以设置为参数形式//其他的为固定写法…

    2022年4月15日
    40
  • lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilter

    lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilterTokenStream:分词器做好处理之后得到的一个流。这个流中存储了分词的各种信息,可以通过TokenStream有效的获取到分词单元。以下是把文件流转换成分词流(TokenStream)的过程首先,通过Tokenizer来进行分词,不同分词器有着不同的Tokenzier,Tokenzier分完词后,通过TokenFilter对已经分好词的数据进行过滤,比如停止词。过滤完之后,把所有的数据组合成一个TokenStream;

    2022年7月22日
    12
  • phpstorm 2021.5激活码【在线注册码/序列号/破解码】[通俗易懂]

    phpstorm 2021.5激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    39
  • pycharm添加conda虚拟环境[通俗易懂]

    pycharm添加conda虚拟环境[通俗易懂]

    2022年8月28日
    4
  • 网站死链查询-在线网站死链查询提交工具免费

    网站死链查询-在线网站死链查询提交工具免费网站死链查询,什么是网站死链,网站死链“死链是指服务器的地址已经改变了.无法找到当前地址位置,包括协议死链和内容死链两种形式。死链出现的原因有网站服务器设置错误;某文件夹名称修改,路径错误链接变成死链等。网站太多的死链会导致网站降权严重着甚至会导致网站被K。当然也有部分小伙伴为了得到更多的提交,专门制作死链主动提交(这属于SEO中一种另类的手法,不建议轻易尝试)更多更全的SEO工具查看图片教程。有一句,“事不过三”,就是说,同样一个新闻,第一次听到,网站死链查询会惹起很多人关注,第二次,关注的人会减少,到了

    2022年7月23日
    13
  • Oracle数据库学习之数据类型和表的操作「建议收藏」

    Oracle数据库学习之数据类型和表的操作「建议收藏」Oracle的数据类型:字符型数据类型charvarcharvarchar2long这几个字段之间的区别:char的长度是固定的,而varchar2的长度是可以变化的。也就是char(20)和varchar2(20)都存储”abc”,char是占用20个字符的,而varchar2是占用3个字符空间的。但是char的效率要高与varchar。这也就是平时说的以空间换效率。如果有一

    2022年8月30日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号