WebService

webService报错总结!!!

Unmarshalling Error: null
在这里插入图片描述
原因:接收的参数实体类中的字段类型是BigDecimal,参数中传的字段类型是VARCHAR2(300)

Unmarshalling Error:
Date类型的字段不能传空。

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.3.1开发规范

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
https://editor.csdn.net/md/?articleId=119547530
在这里插入图片描述
填写组织名和项目名
在这里插入图片描述
添加依赖
在这里插入图片描述
把模块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.根据文档生成客户端和服务端(看这个)

首先根据文档配置xsd文件和wsdl文件
在这里插入图片描述

<?xml version = "1.0" encoding = "UTF-8"?>
<schema attributeFormDefault="unqualified"
        elementFormDefault="qualified"
        targetNamespace="http://soa.cmcc.com/ORDER_REFUND_NOTIFY_Srv"
        xmlns:tns="http://soa.cmcc.com/ORDER_REFUND_NOTIFY_Srv"
        xmlns:msg="http://soa.cmcc.com/MsgHeader"
        xmlns="http://www.w3.org/2001/XMLSchema">
    <import namespace="http://soa.cmcc.com/MsgHeader" schemaLocation="MsgHeader.xsd"/>

    <element name="InputParameters" type="tns:InputParameters"/>
    <element name="OutputParameters" type="tns:OutputParameters"/>

    <complexType name="InputParameters">
        <sequence>
            <element name="MSGHEADER" type="msg:MSGHEADER"  />
            <element name="INPUTCOLLECTION" type="tns:INPUTCOLLECTION"  />
        </sequence>
    </complexType>

    <complexType name="INPUTCOLLECTION">
        <sequence>
            <element name="INPUTCOLLECTION_ITEM" type="tns:INPUTCOLLECTION_ITEM" minOccurs="0" maxOccurs="unbounded" />
        </sequence>
    </complexType>

    <complexType name="INPUTCOLLECTION_ITEM">
        <sequence>
            <element name="REFUND_NO" type="string"  />
            <element name="APPLY_STATUS" type="string"  />
            <element name="REASON" type="string"  />
            <element name="ATTR1" type="string" nillable="true" />
            <element name="ATTR2" type="string" nillable="true" />
            <element name="ATTR3" type="string" nillable="true" />
            <element name="ATTR4" type="string" nillable="true" />
            <element name="ATTR5" type="string" nillable="true" />
            <element name="ATTR6" type="string" nillable="true" />
            <element name="ATTR7" type="string" nillable="true" />
            <element name="ATTR8" type="string" nillable="true" />
            <element name="ATTR9" type="string" nillable="true" />
            <element name="ATTR10" type="string" nillable="true" />
        </sequence>
    </complexType>

    <complexType name="OutputParameters">
        <sequence>
            <element name="RET_CODE" type="string" nillable="true" />
            <element name="ERROR_CODE" type="string" nillable="true" />
            <element name="ERROR_MESSAGE" type="string" nillable="true" />
            <element name="INSTANCE_ID" type="decimal" nillable="true" />
            <element name="REFERENCE1" type="string" nillable="true" />
            <element name="REFERENCE2" type="string" nillable="true" />
            <element name="REFERENCE3" type="string" nillable="true" />
            <element name="REFERENCE4" type="string" nillable="true" />
            <element name="REFERENCE5" type="string" nillable="true" />
            <element name="REFERENCE6" type="string" nillable="true" />
            <element name="REFERENCE7" type="string" nillable="true" />
            <element name="REFERENCE8" type="string" nillable="true" />
            <element name="REFERENCE9" type="string" nillable="true" />
            <element name="REFERENCE10" type="string" nillable="true" />
        </sequence>
    </complexType>
</schema>
<?xml version = "1.0" encoding = "UTF-8"?>
<!-- 2022-11-11 14:07:33 -->
<!-- Generated file version: V0.12 -->
<!-- Copyright (c) 2004-2022  -->
<schema targetNamespace="http://soa.cmcc.com/MsgHeader"
	xmlns:tns="http://soa.cmcc.com/MsgHeader"
	elementFormDefault="qualified"
	attributeFormDefault="qualified"
	xmlns="http://www.w3.org/2001/XMLSchema">
    <complexType name="MSGHEADER">
     <sequence>
       <element name="SOURCESYSTEMID" type="string"  />
       <element name="SOURCESYSTEMNAME" type="string"  />
       <element name="TOKEN" type="string"  />
       <element name="USERID" type="decimal" />
       <element name="USERNAME" type="string" />
       <element name="SUBMITDATE" type="dateTime" />
       <element name="PROVINCE_CODE" type="string" />
       <element name="PAGE_SIZE" type="decimal" nillable="true" />
       <element name="CURRENT_PAGE" type="decimal" nillable="true" />
       <element name="TOTAL_RECORD" type="decimal" nillable="true" />
       <element name="ENVIRONMENT_NAME" type="string" nillable="true" />
     </sequence>
    </complexType>
</schema> 
<?xml version = "1.0" encoding = "UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                  xmlns:tns="http://soa.cmcc.com/ORDER_REFUND_NOTIFY_Srv"
                  name="ORDER_REFUND_NOTIFY_Srv"
                  targetNamespace="http://soa.cmcc.com/ORDER_REFUND_NOTIFY_Srv">

    <wsdl:types>
        <schema xmlns="http://www.w3.org/2001/XMLSchema">
            <import namespace="http://soa.cmcc.com/ORDER_REFUND_NOTIFY_Srv" schemaLocation="ORDER_REFUND_NOTIFY_Srv.xsd"/>
        </schema>
    </wsdl:types>
    <wsdl:message name="ORDER_REFUND_NOTIFY_SrvRequestMessage">
        <wsdl:part name="payload" element="tns:InputParameters"/>
    </wsdl:message>
    <wsdl:message name="ORDER_REFUND_NOTIFY_SrvResponseMessage">
        <wsdl:part name="payload" element="tns:OutputParameters"/>
    </wsdl:message>
    <wsdl:portType name="ORDER_REFUND_NOTIFY_Srv">
        <wsdl:operation name="process">
            <wsdl:input message="tns:ORDER_REFUND_NOTIFY_SrvRequestMessage"/>
            <wsdl:output message="tns:ORDER_REFUND_NOTIFY_SrvResponseMessage"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="ORDER_REFUND_NOTIFY_SrvBinding" type="tns:ORDER_REFUND_NOTIFY_Srv">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="process">
            <soap:operation style="document" soapAction="process"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="ORDER_REFUND_NOTIFY_Srv">
        <wsdl:port name="ORDER_REFUND_NOTIFY_SrvPort" binding="tns:ORDER_REFUND_NOTIFY_SrvBinding">
            <soap:address location="http://localhost:8080/ORDER_REFUND_NOTIFY_Srv"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

在wsdl文件夹目录”shift+右键“打开PowerShell输入命令,生成的代码磁盘路径我放到了桌面,再粘到项目目录中。
在这里插入图片描述

wsdl2java -encoding utf-8 -frontend jaxws21 -p com.ultra.plis.sscm.hqscm.client.imports.orderRefundApplySrv -d C:\Users\Quxingtao520\Desktop -all ORDER_REFUND_NOTIFY_Srv.wsdl

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

在这里插入图片描述

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

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;
    }
    @Autowired
    public 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生成客户端和服务端所有代码,
-d指向需要生成java的wsdl文件本地磁盘路径(不用指定到根目录,也就是com之后的目录,因为包名已经指明)
命令

在这里插入图片描述

wsdl2java -encoding utf-8 -frontend jaxws21 -p com.ultra.plis.sscm.hqscm.client.imports.importConsTeamInstallRouteSrv.wsdl -d D:\workspaces\plis\plis-connection-sscm\src\main\java -all OSB_BP_SOA_HQ_00237_导入施工队安装单业务数据路由服务_V0.1\OSB_BP_SOA_HQ_ImportConsTeamInstallRouteSrv.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 {

    @Autowired
    private 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");

    @Autowired
    private 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());
        }
        //实例ID
        if (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 -encoding UTF-8 -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调用是指利用泛微提供的webservice接口进行数据传输和交互的过程。通过webservice,可以实现不同系统之间的数据传递和功能调用。 泛微webservice调用主要分为以下几个步骤: 首先,我们需要确定要调用的接口,包括接口的名称、参数和返回值等。可以通过查阅泛微的官方文档或与开发人员进行沟通来获取相关信息。 然后,需要编写代码来实现webservice的调用。首先需要创建一个webservice客户端,可以使用泛微提供的SDK或者其他开发工具进行创建。在创建客户端的过程中,需要传入webservice的地址、命名空间和其他相关信息。 接下来,根据接口的要求,传入相应的参数进行调用。可以通过客户端提供的方法来调用接口,并传入相应的参数。调用成功后,返回结果会作为函数的返回值返回。 最后,对返回的结果进行处理。根据接口的返回值类型,可以进行相应的操作,比如将返回的数据存储到数据库中或者进行其他相关的业务逻辑处理。 需要注意的是,在进行webservice调用时,需要进行异常处理和错误处理。当调用出现异常或发生错误时,需要进行相应的处理,比如记录错误日志或进行重试操作。 总的来说,泛微webservice调用是一种实现不同系统间数据传递和功能调用的方式,通过确定接口、编写代码、传入参数和处理结果来实现。它为不同系统间的集成提供了一种有效的解决方案,提高了系统间的数据交互效率和功能的互通性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值