1、标题学习目标

2、webservice基本概念

2.1 什么是webservice

字面看web + service就是网站服务。

比如在开发的界面显示天气,那么就可以直接访问气象局提供的接口。也就是常见的网站服务。

2.2 简介

webservice即网站服务,他是一种跨编程语言,跨操作系统平台的远程调用技术。

所以它可以多系统交互也就是数据传递,是JavaWeb不能实现的,不能跨语言。

2.3 术语

2.3.1开发规范

一共有三种,第一和第三种常用。分别采用soap协议和http协议。



2.3.2 SOAP协议


2.3.3 WSDL文件

就是一个说明书,机器可以阅读的文件。
目的就是描述对外发布接口的信息,对soap协议的描述。


生成的wsdl内容分析

在约束文档中定义了xml片段的格式, 是实际发送请求的请求体和响应的响应体


SEI就是处理请求的接口

实现


通过地址进行发布

UDDI

2.4 应用场景

3 Apache CXF框架介绍

3.1 关于框架

一句话就是webservice的实现框架


优点就是可以跟spring进行整合

4 ApacheCXF实现webservice(jax-ws)

使用的是jaxws方式。
两个部分一个服务端,另一个写客户端。

4.1 服务端开发

创建项目
创建一个空的项目,目的是创建几个项目可以在一个显示。


提示创建目录

添加模块



关联maven


添加依赖
这个演示的是单个框架的依赖,后面会用到和spring整合的依赖。
实战开发中依赖坐标跟组长要。

写接口

接口的实现类

写测试类,发布服务。

右键run运行就ok

最后访问wsdl地址

4.2 客户端远程访问服务端开发

新建Module


填写组织名和项目名

添加依赖

把模块1 的服务端接口粘贴过来

创建测试类,访问服务端


运行查看结果
代理方式时jdk接口代理。

4.3 设置拦截器查看日志中的soap协议内容


先启动服务端,再启动客户端。


soap格式

5 Spring整合ApacheCXF实现WebService(jax-ws)

5.1 服务端

新建modul

选择web项目



添加spring整合ApacheCXF框架的依赖

web.xml配置


再加上一个监听器

新建目录,和spring的xml文件

新建包路径,接口和实现类

spring配置文件中添加约束


启动
右键


启动后访问接口查看说明书

5.2客户端

创建项目


这一步把前两个工程设置为none


添加项目依赖参考03模块

写服务的接口
拷贝03就行

配置spring配置文件,产生代理对象
还是拷贝03


改一下粘贴的配置文件

这个spring文件的目的就是在加载配置文件时,生成代理对象,然后远程访问服务端


写测试类


测试之前确保服务在启动状态

运行

打印输出

6 Ruetful风格

一种软件架构风格,并不是标准。提供了一组设计原则和约束条件,用在客户端和服务端的交互上,基于这种风格开发可以更简洁,更有层次,更利于实现缓存等机制。

总结来说是资源在表现底层的状态转换
资源:在服务器上拿到的任何数据东可以称为资源。图片,文本,页面等。

1、页面请求的地址


2、对应后台不同的请求方法

7 ApacheCXF实现webservice(jax-rs)

7.1 服务端

新建modul



添加依赖

Ctrl + Alt + L 快捷键,格式化代码


这是一个编译的插件

1、创建两个实体类

这个用户有几辆车

2、新建service类和接口

记住以下这个标签的用法,用来描述服务端和客户端传递的对象,可以两种方式分别是xml,json

认识接口中以下注解

接口的实现

发布服务,并打印日志

需要添加log4j文件查看日志

运行测试

7.2 客户端


使用如:

创建modul



添加依赖

创建实体类

新建测试类,在客户端调用服务端保存方法的代码

调用

请求的数据会返回来

8 Spring整合ApacheCXF实现WebService(jax-rs)

8.1 服务端

创建一个web项目



添加依赖

web.xml

spring的配置文件xml

服务的接口,实现类,实体类
复制上一个模块的粘贴就可以

运行

8.2 客户端

新建模块



添加依赖

调用服务端方法查看返回的数据

9 Schema 文件(.xsd)

Schema文件就是.xsd结尾的文件,也叫做约束文档。通过配置Schema文件可以定义xml文件中的信息,也就说xml(实例文档)中的信息都是在Schema文件中定义好的。

开始定义一个书架的标签:

根据上方的约束文档,就可以写一个"标签是书架"的实例文档。xml文件。

Schema标签

约束标签 xsd


实例文档标签 xml

指明图中地址是由 “别名为 :dd的约束” 定义的。


总结

10 HTTP协议

请求服务器过程中的http协议内容

服务器响应

11 生成客户端代码


解析这个url(服务端接口), 自动生成java代码

自动生成的代码

12 面试题


以下在网站扒的信息

https://www.bilibili.com/video/BV15t411S7V1?p=19&spm_id_from=pageDriver

置顶java中级程序员路线图,没看过的速度收藏吧,
Java基础:黑马程序员全套Java教程_Java基础入门教程,零基础小白自学Java必备教程
javaweb阶段
数据库
Mysql:黑马程序员MySQL全套教程,超详细的MySQL数据库优化,MySQL面试热点必考问题
Oracle:黑马程序员Oracle数据库精讲,从0到1学会Oracle数据库
JDBC:深入Sharding-JDBC分库分表从入门到精通【黑马程序员】
C3P0:黑马程序员完整JavaWeb快速入门教程【收藏比赞多系列】

javaweb前端技术
HTML、CSS、Javascript:黑马程序员完整JavaWeb快速入门教程【收藏比赞多系列】
jQuery-:利用jQuery+Ajax+HighCharts打造项目图表
Ajax:黑马程序员前端基础教程Ajax零基础入门_上部 黑马程序员前端基础教程Ajax零基础入门_下部
Vue:黑马程序员vue前端基础教程-4个小时带你快速入门vue
微信小程序:黑马程序员微信小程序开发前端教程_零基础玩转微信小程序 黑马程序员精品WEB前端课程_28节课快速玩转微信小程序

动态网页:黑马程序员完整JavaWeb快速入门教程【收藏比赞多系列】

编程强化
JVM优化:黑马程序员JVM完整教程,全网超高评价,全程干货不拖沓
数据结构算法:黑马程序员Java数据结构与算法,全网资料最全,154张数据结构图 av78639604

软件项目管理
Maven: 2天吃透Maven项目管理工具
SVN:黑马程序员完整JavaWeb快速入门教程【收藏比赞多系列】 黑马程序员SVN视频教程
Git:Git零基础入门到实战详解
Jenkins:黑马程序员Java教程自动化部署Jenkins从环境配置到项目开发

热门技术框架
SSM:黑马程序员Springmvc+Mybatis由浅入深全套视频教程day01
Mybatis-Plus :黑马程序员MybatisPlus深入浅出教程,快速上手Mybatis-Plus
Spring Data:java进阶教程数据层全栈方案Spring Data高级应用
Spring:【Java进阶教程】Spring高级之注解驱动开发详解

分布式架构
Dubbo、Zookeeper:黑马程序员Dubbo快速入门,Java分布式框架必会的教程
SpringCloud:Spring Cloud Alibaba Nacos配置中心与服务发现 黑马程序员Java微服务开发,全面深入学习Spring Cloud Alibaba(SpringCloud)
Eureka:SpringCloud从小白到精通教程,Spring Cloud超完整教程,Spring Cloud微服务架构开发项目实战
Skywalking:java基础教程全面的深入学习Skywalking

服务器中间件
RocketMQ:黑马程序员Java教程RocketMQ系统精讲,电商分布式消息中间件,硬核揭秘双十一
Kafka:黑马程序员Kafka深入浅出,快速玩转分布式发布订阅消息系统
Sharding-JDBC:深入Sharding-JDBC分库分表从入门到精通【黑马程序员】
Redis:黑马程序员Redis入门到精通,Java企业级解决方案必看
MongoDB:黑马程序员java必备基础教程-MongoDB基础入门到高级进阶

服务器技术
Tomcat:黑马程序员Java进阶教程Tomcat核心原理解析
Linux系统:黑马程序员完整JavaWeb快速入门教程【收藏比赞多系列】
CentOS、Virtualbox:黑马程序员-linux从入门到精通
Ubuntu、Vmware:黑马程序员Python教程_600集Python从入门到精通教程(懂中文就能学会)

容器技术
Docker:黑马程序员Docker容器化技术,从零学会Docker教程

业务解决方案(实战项目)
Elasticsearch:elastic stack从入门到实践【快速掌握先进的搜索、数据收集、分析技术java进阶教程】
Lucene:黑马程序员Lucene全文检索技术,从底层到实战应用Lucene全套教程
Quartz:java教程之精品详解Quartz,企业中必会的技能【黑马程序员】
Elastic-Job:轻松入门Apollo分布式配置中心-服务中间件【java基础进阶教程】
SpringSecurity:java基础进阶-企业开发首选的安全框架Spring Security深入浅出
Activiti:黑马程序员Activiti工作流视频教程day01

工作中的实战开发(记录一下)

1.PMS调用PLIS 也就是生成服务端

配置xsd文件,生成webservice服务端代码.

整体情景:PMS通过webservice调用PLIS,两个不同系统的交互。

现场景是写webservice的服务端,供PMS调用webservice这部分。
操作流程:
1、需求的接口服务的编号

2、找到对应的需求文档,查看具体操作

3、在需求文档中拿到服务名,新建包和xsd文件

根据需求文档中的字段配置xsd文件,生成对象和类

4.在公共的文件配置请求的地址

5.通过maven加载配置的我们配置的xsd文件,自动生成类和包(客户端代码)

6.配置pom.xml文件

7.测试
启动本地服务后,模拟访问webservice服务端,会响应该接口信息的报文。

8、可以生成报文后,需要写endpoint类,PMS需要访问这个类,然后再去调用微服务暴露的接口。作用等同于web项目中的controller。

微服务的接口

package com.ultra.plis.pms.client.order;import com.bit.common.util.PageResult;
import com.bit.common.util.ReturnResult;
import com.ultra.plis.pms.client.order.model.*;
import com.ultra.plis.pms.config.FeignConfiguration;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.context.annotation.Primary;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;/*** @Author: ......* @Date: 2021/8/20 9:28*/
@Primary
@FeignClient(value = "bit-msa-gateway-api", configuration = FeignConfiguration.class)
public interface OrderFeignClient {/*** 采购订单-列表查询** @param orderQuery* @return*/@GetMapping("/ultra-plis-order/order/getOrderList")ReturnResult<PageResult<OrderVO>> getOrderList(@SpringQueryMap OrderQuery orderQuery);
}
package com.ultra.plis.pms.webservice.pageInquirySCMPoOrderRouteSrv;import com.bit.common.util.PageResult;
import com.bit.common.util.ReturnCodeEnum;
import com.bit.common.util.ReturnResult;
import com.ultra.plis.pms.client.order.OrderFeignClient;
import com.ultra.plis.pms.client.order.model.OrderQuery;
import com.ultra.plis.pms.client.order.model.OrderVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;
import java.util.List;
import java.util.stream.Collectors;@Endpoint
public class PageInquirySCMPoOrderRouteEndpoint {private OrderFeignClient orderFeignClient;public OrderFeignClient getPurchaseFeignClient() {return orderFeignClient;}@Autowiredpublic void setPurchaseFeignClient(OrderFeignClient orderFeignClient) {this.orderFeignClient = orderFeignClient;}@PayloadRoot(namespace = "http://ln.mss.cmcc.com/scms/PageInquirySCMPoOrderRouteSrv", localPart = "PageInquirySCMPoOrderRouteRequest")@ResponsePayload//XmlRootElement: 将类或枚举类型映射到 XML 元素。JAXB中的注解,用来根据java类生成xml内容。public JAXBElement<PageInquirySCMPoOrderRouteResponse> PageInquirySCMPoOrderRouteSrv(@RequestPayload JAXBElement<PageInquirySCMPoOrderRouteRequest> request){PageInquirySCMPoOrderRouteResponse resp = new PageInquirySCMPoOrderRouteResponse();//业务代码...PageInquirySCMPoOrderRouteRequest requestValue = request.getValue();OrderQuery orderQuery = requestValue.getPageInquirySCMPoOrderRouteRequest().to();//OrderQuery orderQuery1 = new OrderQuery();//orderQuery1.setEntityCode("83126201508745");ReturnResult<PageResult<OrderVO>> returnResultOrderList = orderFeignClient.getOrderList(orderQuery);if (returnResultOrderList.getCode() != ReturnCodeEnum.SUCCESS.getCode()){throw new RuntimeException("获取采购订单超时");}PageResult<OrderVO> orderListPage = returnResultOrderList.getData();List<OrderVO> orderVOList = orderListPage.getDatas();List<Outputcollection> outputcollectionList = orderVOList.stream().map(order -> Outputcollection.from(order)).collect(Collectors.toList());PageInquirySCMPoOrderRouteResponse.OUTPUTCOLLECTION outputcollection = new PageInquirySCMPoOrderRouteResponse.OUTPUTCOLLECTION();outputcollection.setOutputcollection(outputcollectionList);//查询结果集resp.setOUTPUTCOLLECTION(outputcollection);//当前页码resp.setCURRENTPAGE(orderListPage.getPageNo().longValue());//页大小resp.setPAGESIZE(orderListPage.getPageSize().longValue());//总页数resp.setTOTALPAGE(orderListPage.getTotalPage().longValue());//总记录数resp.setTOTALRECORD(orderListPage.getTotalNum().longValue());resp.setESBFLAG("Y");resp.setESBRETURNCODE("成功");JAXBElement<PageInquirySCMPoOrderRouteResponse> jaxbElement = new JAXBElement<PageInquirySCMPoOrderRouteResponse>(new QName("", "PageInquirySCMPoOrderRouteResponse"), PageInquirySCMPoOrderRouteResponse.class, resp);return jaxbElement;}
}

测试
拿到访问服务端产生的路径,在soapUI模拟调用

1、粘贴到wsdl



会直接调用服务端的endpoint类,然后去调用微服务实现查询。

2.PLIS调用PMS

通过apache-cxf框架把PMS系统提供的wsdl文件生成Java类(webservice的客户端)

场景就是:PMS的服务端提供了wsdl文件,通过cxf框架反编译成Java代码,生成客户端。
请求报文如图:wsdl

文档地址 https://blog.csdn.net/sinat_34979884/article/details/78776305

cmd命令
-p 指定其wsdl的命名空间,也就是要生成代码的包名:
-all生成客户端和服务端所有代码,
最后指向需要生成java的wsdl文件本地磁盘路径
命令

wsdl2java -encoding utf-8 -frontend jaxws21 -p com.ultra.plis.pms.webservice.pageInquiryProStraccRouteSrv -d D:\lingke\ideaproject\plis-connection-pms\src\main\java\com\ultra\plis\pms\webservice\pageInquiryProStraccRouteSrv -all OSB_BP_SOA_HQ_PageInquiryProStraccRouteSrv.wsdl

生成的java类如下,
在Client类中打一些日志并调用另一方对接的服务端,并把返回的数据转换到vo。
Controller类是手写的,暴露给我们这边的微服务供他们调用,然后去调用client。
vo包下的也是手写,对方返回的数据封装到这里的类。

如下controller

package com.ultra.plis.pms.webservice.pageInquiryPMSBudgetExeRecSrv;import com.bit.common.util.ReturnResult;
import com.ultra.plis.pms.util.XmlDateUtill;
import com.ultra.plis.pms.webservice.pageInquiryPMSBudgetExeRecSrv.vo.InputParameterQuery;
import com.ultra.plis.pms.webservice.pageInquiryPMSBudgetExeRecSrv.vo.OutputParameterVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** @Description:* @Author dcm* @Date 2021-09-26 10:00* @Version 1.0*/
@Api(description = "查询PMS预算执行明细服务(分页)", tags = "查询PMS预算执行明细服务(分页)")
@RefreshScope
@RestController
@RequestMapping("/pmsBudgetExeRecController")
@Slf4j
public class PmsBudgetExeRecController {@Autowiredprivate PageInquiryPMSBudgetExeRec_Client client;@ApiOperation("查询PMS预算执行明细(分页)")@PostMapping("/findPmsBudgetExeRec")public ReturnResult<OutputParameterVO> findPmsBudgetExeRec(@RequestBody InputParameterQuery inputParameterQuery){InputParameters inputParameters = new InputParameters();//省公司订单inputParameters.setPROVINCECODE(inputParameterQuery.getProvincecode());//单据编号if (StringUtils.isNotBlank(inputParameterQuery.getDocumentcode())){inputParameters.setDOCUMENTCODE(inputParameterQuery.getDocumentcode());}//系统来源if (StringUtils.isNotBlank(inputParameterQuery.getAppid())){inputParameters.setAPPID(inputParameterQuery.getAppid());}//项目编码if (StringUtils.isNotBlank(inputParameterQuery.getProjectcode())){inputParameters.setPROJECTCODE(inputParameterQuery.getProjectcode());}//查询条件扩展if (StringUtils.isNotBlank(inputParameterQuery.getQueryext())){inputParameters.setQUERYEXT(inputParameterQuery.getQueryext());}//最后更新开始日期if (inputParameterQuery.getLastupdatestart()!=null){inputParameters.setLASTUPDATESTART(XmlDateUtill.convertToXMLGregorianCalendar(inputParameterQuery.getLastupdatestart()));}//最后更新结束日期if (inputParameterQuery.getLastupdateend()!=null){inputParameters.setLASTUPDATEEND(XmlDateUtill.convertToXMLGregorianCalendar(inputParameterQuery.getLastupdateend()));}try {return client.pageInquiryPMSBudgetExeRec(inputParameters);} catch (Exception e) {return ReturnResult.error(e.toString());}}
}

client类


package com.ultra.plis.pms.webservice.pageInquiryPMSTaskAttInfoSrv;/*** Please modify this class to meet your needs* This class is not complete*/import com.bit.common.util.ReturnResult;
import com.ultra.plis.pms.client.base.BaseFeignClient;
import com.ultra.plis.pms.client.base.vo.MsgHeaderConfig;
import com.ultra.plis.pms.common.util.SoaTokenUtils;
import com.ultra.plis.pms.util.XmlDateUtill;
import com.ultra.plis.pms.webservice.pageInquiryPMSTaskAttInfoSrv.vo.OutputCollectionVO;
import com.ultra.plis.pms.webservice.pageInquiryPMSTaskAttInfoSrv.vo.OutputParameterVO;
import com.ultra.plis.pms.webservice.pageInquiryPMSTaskAttInfoSrv.vo.TaskAttributeVO;
import com.ultra.plis.pms.webservice.pageInquiryPMSTaskAttInfoSrv.vo.TaskInfoVO;
import io.jsonwebtoken.lang.Assert;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import javax.xml.namespace.QName;
import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;/*** This class was generated by Apache CXF 3.4.3* 2021-09-24T20:25:53.231+08:00* Generated source version: 3.4.3** @Author quxingtao* @Date 2021/10/14*/
@Slf4j
@Service
public final class OSBCPMSMDSGHQPageInquiryPMSTaskAttInfoSrv_OSBCPMSMDSGHQPageInquiryPMSTaskAttInfoSrvPort_Client {//private static final QName SERVICE_NAME = new QName("http://soa.cmcc.com/OSB_CPMS_MDSG_HQ_PageInquiryPMSTaskAttInfoSrv", "OSB_CPMS_MDSG_HQ_PageInquiryPMSTaskAttInfoSrv");@Autowiredprivate BaseFeignClient baseFeignClient;public ReturnResult<OutputParameterVO> pageInquiryPMSTaskAttInfoSrv(InputParameters request){log.info("*********webService开始调用*******");URL wsdlURL = null;log.info("*********webService开始获取接口配置*******");ReturnResult<MsgHeaderConfig> msgHeaderConfigReturnResult = baseFeignClient.getInterfaceCode("OSB_CPMS_MDSG_HQ_00016");Assert.state(msgHeaderConfigReturnResult.getCode() == 200, "调用Base配置接口错误");MsgHeaderConfig msgHeaderConfig = msgHeaderConfigReturnResult.getData();log.info("*********webService获取接口配置成功*******");log.info("****webService获取接口配置Namespace:"+msgHeaderConfig.getWdslNamespace());log.info("****webService获取接口配置ServiceName:"+msgHeaderConfig.getServiceName());QName SERVICE_NAME = new QName(msgHeaderConfig.getWdslNamespace(), msgHeaderConfig.getServiceName());try {log.info("*********webService获取接口调用地址*******");wsdlURL = new URL(msgHeaderConfig.getWsdlLocation());log.info("webServiceh接口调用地址*******"+wsdlURL);} catch (MalformedURLException e) {log.info("*********webService获取接口调用地址失败*******");e.printStackTrace();}log.info("*********webService准备调用*******");log.info("*********webService开始拼装MsgHeader*******");request.msgheader = this.getMsgHeader(msgHeaderConfig);if ("false".equals(msgHeaderConfig.getSwitchs())){return ReturnResult.error("不调用webService接口");}log.info("*********webService拼装MsgHeader完成*******");OSBCPMSMDSGHQPageInquiryPMSTaskAttInfoSrv_Service ss = new OSBCPMSMDSGHQPageInquiryPMSTaskAttInfoSrv_Service(wsdlURL, SERVICE_NAME);OSBCPMSMDSGHQPageInquiryPMSTaskAttInfoSrv port = ss.getOSBCPMSMDSGHQPageInquiryPMSTaskAttInfoSrvPort();OutputParameters outputParameters = port.process(request);log.info("*********webService接口调用输出*******");OutputParameterVO outputParameterVO = this.convert(outputParameters);String esbflag = outputParameters.getESBFLAG();String serviceFlag = outputParameters.getBIZSERVICEFLAG();if ("FALSE".equals(esbflag)){String esbReturnCode = outputParameters.getESBRETURNCODE();String esbReturnMessage = outputParameters.getESBRETURNMESSAGE();//无错误信息实体 outputParameters.getERRORCOLLECTIO();if ("ESB-01".equals(esbReturnCode)){return ReturnResult.error("服务调用超时"+esbReturnMessage);}if ("ESB-02".equals(esbReturnCode)){return ReturnResult.error("服务请求和WSDL规范不匹配"+esbReturnMessage);}if ("ESB-03".equals(esbReturnCode)){return ReturnResult.error("服务IP地址未授权"+esbReturnMessage);}if ("ESB-04".equals(esbReturnCode)){return ReturnResult.error("服务安全校验不通过"+esbReturnMessage);}if ("ESB-05".equals(esbReturnCode)){return ReturnResult.error("ESB总线内部异常"+esbReturnMessage);}}if ("FALSE".equals(serviceFlag)){String bizreturnCode= outputParameters.getBIZRETURNCODE();String bizreturnmessage= outputParameters.getBIZRETURNMESSAGE();if ("BIZ-01".equals(bizreturnCode)){return ReturnResult.error("服务请求输入完整性校验不通过"+bizreturnmessage);}if ("BIZ-02".equals(bizreturnCode)){return ReturnResult.error("服务业务规则处理不通过"+bizreturnmessage);}if ("BIZ-03".equals(bizreturnCode)){return ReturnResult.error("业务系统处理超时"+bizreturnmessage);}if ("BIZ-04".equals(bizreturnCode)){return ReturnResult.error("业务系统其它处理异常"+bizreturnmessage);}}log.info("*********webService预占占用成功*******");return ReturnResult.success(outputParameterVO);}private MSGHEADER getMsgHeader(MsgHeaderConfig msgHeaderConfig) {MSGHEADER msgHeader = new MSGHEADER();msgHeader.setTOKEN(SoaTokenUtils.encode(null));msgHeader.setPROVINCECODE(msgHeaderConfig.getProvinceCode());msgHeader.setSOURCESYSTEMID(msgHeaderConfig.getSourceSystemId());msgHeader.setSOURCESYSTEMNAME(msgHeaderConfig.getSourceSystemName());msgHeader.setSUBMITDATE(XmlDateUtill.convertToXMLGregorianCalendar(msgHeaderConfig.getSubmitDate()));msgHeader.setTRACEID(msgHeaderConfig.getTotalRecord());msgHeader.setUSERID(new BigDecimal(msgHeaderConfig.getUserId()));msgHeader.setUSERNAME(msgHeaderConfig.getUserName());return msgHeader;}public OutputParameterVO convert(OutputParameters outputParameters){log.info("*********webService接口调用输出VO类转换开始*******");OutputParameterVO vo = new OutputParameterVO();//ESB标识if (StringUtils.isNotBlank(outputParameters.getESBFLAG())){vo.setEsbflag(outputParameters.getESBFLAG());}//ESB返回代码if (StringUtils.isNotBlank(outputParameters.getESBRETURNCODE())){vo.setEsbreturncode(outputParameters.getESBRETURNCODE());}//系统返回消息if (StringUtils.isNotBlank(outputParameters.getESBRETURNMESSAGE())){vo.setEsbreturnmessage(outputParameters.getESBRETURNMESSAGE());}//业务服务执行标识if (StringUtils.isNotBlank(outputParameters.getBIZSERVICEFLAG())){vo.setBizserviceflag(outputParameters.getBIZSERVICEFLAG());}//业务服务返回代码if (StringUtils.isNotBlank(outputParameters.getBIZRETURNCODE())){vo.setBizreturncode(outputParameters.getBIZRETURNCODE());}//业务服务返回消息if (StringUtils.isNotBlank(outputParameters.getBIZRETURNMESSAGE())){vo.setBizreturnmessage(outputParameters.getBIZRETURNMESSAGE());}//实例IDif (StringUtils.isNotBlank(outputParameters.getINSTANCEID())){vo.setInstanceid(outputParameters.getINSTANCEID());}//页大小if (outputParameters.getPAGESIZE()!=null){vo.setPagesize(outputParameters.getPAGESIZE().longValue());}//总页数if (outputParameters.getTOTALPAGE()!=null){vo.setTotalpage(outputParameters.getTOTALPAGE().longValue());}//记录总数if (outputParameters.getTOTALRECORD()!=null){vo.setTotalrecord(outputParameters.getTOTALRECORD().longValue());}//当前页码if (outputParameters.getCURRENTPAGE()!=null){vo.setCurrentpage(outputParameters.getCURRENTPAGE().longValue());}OutputParameterVO outputParameterVO = new OutputParameterVO();List<OUTPUTCOLLECTIONITEM> outputcollectionitem = outputParameters.getOUTPUTCOLLECTION().getOUTPUTCOLLECTIONITEM();List<OutputCollectionVO> outputCollectionVOS =  new ArrayList<>();OutputCollectionVO outputCollectionVO1 = new OutputCollectionVO();if (outputcollectionitem!=null){List<TaskInfoVO> taskInfoVOS = new ArrayList<>();for (OUTPUTCOLLECTIONITEM item:outputcollectionitem){OutputCollectionVO outputCollectionVO = new OutputCollectionVO();outputCollectionVO.setProvincecode(item.getPROVINCECODE());outputCollectionVO.setBudgetrecheadid(item.getPROJECTCODE());outputCollectionVO.setDocumenttype(item.getPROVINCECODE());outputCollectionVO.setDocumentcode(item.getPROVINCECODE());List<TASKINFOITEM> taskinfoitem = item.getTASKINFO().getTASKINFOITEM();if (taskinfoitem!=null){TaskInfoVO taskInfoVO = new TaskInfoVO();for (TASKINFOITEM taskinfoitem1:taskinfoitem){taskInfoVO.setTaskcode(taskinfoitem1.getTASKCODE());taskInfoVO.setTaskname(taskinfoitem1.getTASKNAME());taskInfoVO.setTemplatename(taskinfoitem1.getTEMPLATENAME());taskInfoVO.setTemplatecode(taskinfoitem1.getTEMPLATECODE());taskInfoVO.setProvince(taskinfoitem1.getPROVINCE());taskInfoVO.setProvinceencoded(taskinfoitem1.getPROVINCEENCODED());taskInfoVO.setCity(taskinfoitem1.getCITY());taskInfoVO.setCitycode(taskinfoitem1.getCITYCODE());taskInfoVO.setCounty(taskinfoitem1.getCOUNTY());taskInfoVO.setCountycode(taskinfoitem1.getCOUNTYCODE());taskInfoVO.setManagermajorname(taskinfoitem1.getMANAGERMAJORNAME());taskInfoVO.setManagermajor(taskinfoitem1.getMANAGERMAJOR());taskInfoVO.setOutputext(taskinfoitem1.getOUTPUTEXT());List<TaskAttributeVO> taskAttributeVOS = new ArrayList<>();List<TASKATTRIBUTEITEM> taskattributeitem = taskinfoitem1.getTASKATTRIBUTE().getTASKATTRIBUTEITEM();if (taskattributeitem!=null){for (TASKATTRIBUTEITEM taskattributeitems:taskattributeitem){TaskAttributeVO taskAttributeVO = new TaskAttributeVO();taskAttributeVO.setInfoname(taskattributeitems.getINFONAME());taskAttributeVO.setInfocode(taskattributeitems.getINFOCODE());taskAttributeVO.setInfodata(taskattributeitems.getINFODATA());taskAttributeVO.setOutputext(taskattributeitems.getOUTPUTEXT());taskAttributeVOS.add(taskAttributeVO);}}taskInfoVO.setTaskattribute(taskAttributeVOS);taskInfoVOS.add(taskInfoVO);}}outputCollectionVO1.setTaskInfoVOS(taskInfoVOS);outputCollectionVOS.add(outputCollectionVO1);}outputParameterVO.setOutputcollection(outputCollectionVOS);}log.info("*********webService接口调用输出VO类转换结束*******");return outputParameterVO;}}

测试直接调用controller即可

3.通过cxf生成服务端(生成服务端的另种写法)

两一种方式生成服务端
项目组后期统一使用这种方式:原因是生成服务端需要通过对方给我们提供的wsdl生成,上一种方式使用是因为项目一开始总公司没有提供wsdl,所以使用手动配schema标签的的方式。

wsdl2java -frontend jaxws21 -p OSB_BP_SOA_HQ_PageInquiryPickingOrdRouteSrv -all D:\makeWsdl\物资\OSB_BP_SOA_HQ_00061_查询SCM领料申请单信息路由服务(分页)_V0.1\OSB_BP_SOA_HQ_PageInquiryPickingOrdRouteSrv.wsdl

生成之后的Java文件

本地生成的java代码拉到idea中

生成的相当于Endpoint类,在类中写业务代码


发布:
正常是在生成的…Server.java中发布,不知什么原因不能访问到wsdl

所以配置了一个发布的配置文件


访问路径

/plis-connection-pms/services/OSB_BP_SOA_HQ_ImportPMSRequModifyRouteSrv?wsdl


生成wsdl后,到soapUI模拟访问pms模块,调用stock模块的服务

代码会访问 impl实现类中的process方法执行业务代码


通过暴露的接口执行stock模块

再stock中通过手写sql的方式在库中查询数据

WebService相关推荐

  1. java工程webservice的应用案例

    在java项目中使用webservice 今天学习webservice,主要参考了网络上的一些文章. 1.关于原理的介绍:个人认为这篇文章写得不错了,戳这里. 2.关于demo的编写:个人认为这篇文章 ...

  2. 添加引用方式抛出和捕获干净的WebService异常

    转载:http://www.cnblogs.com/ahdung/p/3953431.html 说明:[干净]指的是客户端在捕获WebService(下称WS)抛出的异常时,得到的ex.Message ...

  3. 调试webservice遇到“测试窗体只能用于使用基元类型作为参数的方法”的解决办法...

    之前一直写webservice 没有遇见这种情况,因为一般返回的参数整形 字符串 之类的 都是基本类型,最多也就是把xml序列化为一个字符串返回,这次遇到了返回一个引用类型的,不能直接调试了.所以,现 ...

  4. 怎样提高WebService的性能

    服务器端WebService程序 using System.Runtime.Serialization.Formatters.Binary; using System.IO; using System ...

  5. 電子商務新紀元-WebService With BizSnap

    電子商務新紀元-WebService With BizSnap WebService SOAP(Simple Object Access Protocol) Web Services Descript ...

  6. webservice 暴漏接口_webService接口是什么?

    展开全部 Web 是使应用62616964757a686964616fe59b9ee7ad9431333431366263程序可以与平台和编程语言无关的方式进行相互通信的一项技术.Web 服务是一个软 ...

  7. .NET调用JAVA的WebService方法

    调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,在网上也有相关资料, ...

  8. WebService客户端添加SOAPHeader信息

    WebService客户端添加SOAPHeader信息 通过JAXBContext创建Marshaller对头信息进行解析为dom,获取WSBindingProvider,使用Headers.crea ...

  9. Spring整合CXF,发布RSETful 风格WebService

    这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有很大一部分都是一样的.关于发布CXF WebServer和Spring整合CXF这里就不再多加赘述了.如果你对Spring整合CXF ...

  10. php的webservice的wsdl的XML无法显示

    php的webservice的因为wsdl有中文所以xml无法显示 可以用Nopepad++  转码即可  以UTF-8无BOM编码

最新文章

  1. 从零开始写个编译器吧 - 单词化简述(Tokenization)
  2. JS函数式编程概念理解:函子(Functor)
  3. ArrayList笔记
  4. java中final使用
  5. GitForWindows工具集(GitBash命令行)
  6. 数据结构之栈的应用(算术计算)
  7. 易语言通过服务器发送文件,易语言局域网文件传输带聊天功能例程
  8. 初识——信息安全等级保护
  9. 华为交换机S5700系列配置通过STelnet登录设备示例
  10. Apache Hudi入门应用
  11. classmethod作用
  12. 微信小程序学习笔记-(10)-猫眼电影案例
  13. linux网卡驱动模块名称,Linux下根据模块名查看网卡驱动版本
  14. 短信API整合在spring里面(3)
  15. 基于Matlab的火灾预警系统
  16. 基于Oneplus 7 Pro的Flyme9&MIUI12.5刷机教程
  17. [Practical.Vim(2012.9)].Drew.Neil.Tip01 学习摘要
  18. one-hot和Embedding
  19. springboot集成阿里MNS消息队列发布订阅消息功能
  20. 协议系列之TCP/IP协议

热门文章

  1. 【计算机】数据结构-严蔚敏/清华大学P4
  2. Android音视频学习路线
  3. PMP学习资料干货分享 - 干货满满
  4. python熊猫烧香_'熊猫烧香'病毒专题:多少变种,怎么破坏,如何查杀?
  5. Git 详细安装教程(详解 Git 安装过程的每一个步骤)
  6. 用JS写一个电影《黑客帝国》显示屏黑底绿字雨风格的唐诗欣赏器
  7. 题目:身份证录入系统 一、语言和环境 a)实现语言Java, 使用Android开发环境实现《身份证录入系统》APP。
  8. 【信号与系统-可视化】基本信号的产生( Python Numpy和Matplotlib实现)
  9. VIM 编辑器配置与使用
  10. 2019年PAT甲级冬季考试真题及参考答案