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.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.根据文档生成客户端和服务端(看这个)
首先根据文档配置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的方式在库中查询数据