在文章中,我学习了spring-ws基本的知识,在文章最后我也实现一个简单的项目,访问可以看到wsdl文件,但是我也遇到了一个问题,无法通过soap UI的测试,经过这一段业余时间的学习,这个问题解决。

这是上一个学习创建的项目的demo演示链接,打开可以看到生成的wsdl。

遗留问题

上一次学习遇到的问题是,通过生成的wsdl在soap UI测试的时候,生成的请求参数和我要解析的参数不一样,我认为无法解析,

这是soap ui生成的请求数据

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://mycompany.com/hr/webservice"><soapenv:Header/><soapenv:Body><web:HolidayRequest><!--You may enter the following 2 items in any order--><web:Holiday><!--You may enter the following 2 items in any order--><web:StartDate>2017-05-05</web:StartDate><web:EndDate>2017-05-05</web:EndDate></web:Holiday><web:EmployeeType><!--You may enter the following 3 items in any order--><web:Number>147</web:Number><web:FirstName>156</web:FirstName><web:LastName>457</web:LastName></web:EmployeeType></web:HolidayRequest></soapenv:Body>
</soapenv:Envelope>

后台解析的代码:

 startDateExpression = xPathFactory.compile("//tns:StartDate", Filters.element(), null, namespace);endDateExpression = xPathFactory.compile("//tns:EndDate", Filters.element(), null, namespace);firstNameExpression = xPathFactory.compile("//tns:FirstName", Filters.element(), null, namespace);lastNameExpression = xPathFactory.compile("//tns:LastName", Filters.element(), null, namespace);

我认为无法解析是因为两边的表达式不一样,无法解析对应的字段,可是经过最近一段学习,发现很多wsdl都不是对应,但是仍然可以正常提供服务,于是我不管两边不一样的问题,使用soap ui 测试一下,结果确实接收到了请求,测试结果:

请求进来了
Booking holiday for [Fri May 05 00:00:00 CST 2017-Fri May 05 00:00:00 CST 2017] for [156 457] 

从结果上看,数据都取出来。

另外这里有个事情需要解释一下:

xsd修改了,不再和上一篇文章中的内容完全一样,这是修改后的文件:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://mycompany.com/hr/webservice"elementFormDefault="qualified" targetNamespace="http://mycompany.com/hr/webservice"><xs:element name="HolidayRequest"><xs:complexType><xs:all><xs:element name="Holiday" type="tns:Holiday"/><xs:element name="EmployeeType" type="tns:Employee"/></xs:all></xs:complexType></xs:element><xs:complexType name="Holiday"><xs:all><xs:element name="StartDate" type="xs:string"/><xs:element name="EndDate" type="xs:string"/></xs:all></xs:complexType><xs:complexType name="Employee"><xs:all><xs:element name="Number" type="xs:integer"/><xs:element name="FirstName" type="xs:string"/><xs:element name="LastName" type="xs:string"/></xs:all></xs:complexType>
</xs:schema>

不知道有没有奇怪人我为什么,我把前缀改成了【tns】,原因是这样的,当我把前缀改成【hr】时:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:hr="http://mycompany.com/hr/webservice"elementFormDefault="qualified" targetNamespace="http://mycompany.com/hr/webservice"><xs:element name="HolidayRequest"><xs:complexType><xs:all><xs:element name="Holiday" type="hr:Holiday"/><xs:element name="EmployeeType" type="hr:Employee"/></xs:all></xs:complexType></xs:element><xs:complexType name="Holiday"><xs:all><xs:element name="StartDate" type="xs:string"/><xs:element name="EndDate" type="xs:string"/></xs:all></xs:complexType><xs:complexType name="Employee"><xs:all><xs:element name="Number" type="xs:integer"/><xs:element name="FirstName" type="xs:string"/><xs:element name="LastName" type="xs:string"/></xs:all></xs:complexType>
</xs:schema>

然后重启项目生成wsdl,结果如下:

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:sch="http://mycompany.com/hr/webservice" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://mycompany.com/hr/webservice" targetNamespace="http://mycompany.com/hr/webservice">
<wsdl:types>
<xs:schema xmlns:hr="http://mycompany.com/hr/webservice" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://mycompany.com/hr/webservice">
<xs:element name="HolidayRequest">
<xs:complexType>
<xs:all>
<xs:element name="Holiday" type="hr:Holiday"/>
<xs:element name="EmployeeType" type="hr:Employee"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:complexType name="Holiday">还有很多

可以看到,生成的wsdl头部中仍然是:

xmlns:tns="http://mycompany.com/hr/webservice" targetNamespace="http://mycompany.com/hr/webservice"

我查看了一下源码,在设置namespace的代码中:

@Overridepublic void afterPropertiesSet() throws WSDLException {Assert.notNull(getTargetNamespace(), "'targetNamespace' is required");WSDLFactory wsdlFactory = WSDLFactory.newInstance();Definition definition = wsdlFactory.newDefinition();definition.setTargetNamespace(getTargetNamespace());definition.addNamespace(TARGET_NAMESPACE_PREFIX, getTargetNamespace());if (importsProvider != null) {importsProvider.addImports(definition);}if (typesProvider != null) {typesProvider.addTypes(definition);}if (messagesProvider != null) {messagesProvider.addMessages(definition);}if (portTypesProvider != null) {portTypesProvider.addPortTypes(definition);}if (bindingsProvider != null) {bindingsProvider.addBindings(definition);}if (servicesProvider != null) {servicesProvider.addServices(definition);}setDefinition(definition);}

其中使用一个名为TARGET_NAMESPACE_PREFIX的常量作为前缀,在类中定义如下:

public static final String TARGET_NAMESPACE_PREFIX = "tns";

也就是说,如果你采用的是生成wsdl,而不是自己写的wsdl的话,自己定义的命名空间都是tns前缀,
所以,我也就改成tns了,反正写什么都没什么用,最终都是tns。

实现静态的wsdl访问

spring-ws推荐第一次生成之后,采用静态配置的方式访问wsdl文件,于是新建了一个webservicelearn2项目。

把上一篇文章生成的wsdl文件另存为orders.wsdl,放到web-inf下面,web.xml没有改,pom.xml文件也没有修改,只有spring-ws配置文件改成了下面这个样子:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oxm="http://www.springframework.org/schema/oxm"xmlns:sws="http://www.springframework.org/schema/web-services"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/oxmhttp://www.springframework.org/schema/oxm/spring-oxm.xsdhttp://www.springframework.org/schema/web-serviceshttp://www.springframework.org/schema/web-services/web-services.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><sws:static-wsdl id="orders" location="/WEB-INF/orders.wsdl"/></beans>

按照文档说明,此时访问http://localhost:8089/webserv...就可以访问了。

在这期间,项目clean了一下,重新下载jar包,然后项目就一直出错,启动项目时总是报500错误:

java.lang.ClassNotFoundException: javax.wsdl.extensions.ExtensibilityElementat java.net.URLClassLoader.findClass(URLClassLoader.java:381)at org.eclipse.jetty.webapp.WebAppClassLoader.findClass(WebAppClassLoader.java:550)at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:475)at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:428)at org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition.<init>(DefaultWsdl11Definition.java:56)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:423)at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89)

我知道这是缺jar,缺的是wsdlj jar包,但是spring-ws官方参考文档上说并不需要这个jar,这是官方参考文档
其中关于依赖的配置如下:

<dependencies><dependency><groupId>org.springframework.ws</groupId><artifactId>spring-ws-core</artifactId><version></version></dependency><dependency><groupId>jdom</groupId><artifactId>jdom</artifactId><version>2.0.1</version></dependency><dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.1</version></dependency>
</dependencies>

我一直以为,我的项目哪里出错了,因为开始的项目是对的,只不过重新下载jar就出错了,肯定是我哪里改错了,就这个问题,还咨询了jetbrains idea的技术才支持,最后才发现,spring-ws-core的版本问题造成的;

这是2.1.4版本:

这是最新版本:

也就是说新版本,需要在pom.xml配置wsdlj才能使用,至于为什么刚开始是对的,我也没想明白。

到此为止,动态生成也好,静态wsdl也好,都能正常访问,有些东西,看着简单,自己搞起来,总是出错,所以还是要多动手。

实现一个spring webservice服务端二:创建一个可以访问的webservice相关推荐

  1. Spring和CXF整合发布WebService(服务端、客户端)

    参考Spring和CXF整合发布WebService(服务端.客户端) 转载于:https://www.cnblogs.com/timspace/p/11113576.html

  2. WebSocket 从入门到精通 -- Spring boot服务端客户端 -- HTML客户端

    注意:学习本文章一定要打开自己的开发工具,代码中有详细的解释.电脑不在身边建议先收藏,方便日后观看.最后祝大家技术突飞猛进,早日拿到心仪的offer. WebSocket -- 从入门到精通 基础讲解 ...

  3. 使用Servlet实现重定向到另一个Servlet文件下载服务端下载

    场景:使用Servlet实现重定向到另一个Servlet文件下载服务端下载,重定向的Servlet只做验证处理功能,        而实际下载功能是内部服务. 1.创建一个spring的web项目,确 ...

  4. SpringBoot+Axis2搭建WebService服务端

    SpringBoot+Axis2搭建WebService服务端 之前用过Spring + Axis2搭建过WebService项目,网上也有很多资料教程,最近需要在一个SpringBoot项目中添加A ...

  5. java cxf服务端代码_【JAVA】 cxf 生成 webservice 服务端代码

    CXF Apache CXF = Celtix + XFire.CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding . ...

  6. JSR-303 Bean Validation 介绍及 Spring MVC 服务端验证最佳实践

    任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用在很多时候,同样的数据验证逻辑会出现在不同的层, ...

  7. 区块链教程Fabric1.0源代码分析流言算法Gossip服务端二

    区块链教程Fabric1.0源代码分析流言算法Gossip服务端二 Fabric 1.0源代码笔记 之 gossip(流言算法) #GossipServer(Gossip服务端) 5.2.commIm ...

  8. PHP写webservice服务端

    1) WebService技术介绍 WebService是一种跨编程语言和跨操作系统平台的远程调用技术.仅仅有通过Web Service,client和server才可以自由的用HTTP进行通信.不论 ...

  9. Asp.net webApi 通过WebSocket推送消息给客户端,搭建一个即是服务端又是客户端的服务

    Asp.net webApi 通过WebSocket推送消息给客户端,搭建一个即是服务端又是客户端的服务_IT_ziliang的博客-CSDN博客 WebSocket是一种在单个TCP连接上进行全双工 ...

最新文章

  1. 5G是很快,但也别忘了网络安全问题!
  2. Winform中实现连接Mysql8使用mysqldump实现备份表的数据
  3. 矩阵运算和文本处理中的分类问题
  4. 《Linux内核设计与实现》读书笔记(七)- 中断处理
  5. 2016网络安全***赛记录
  6. Prufer序列相关
  7. java如何读取自定义log4j2_spring boot自定义log4j2日志文件的实例讲解
  8. 哪些原因会导致rs485转换器信号受干扰?
  9. UVALive 6508 Permutation Graphs
  10. 整理的C++面试题,大厂面试总遇到!
  11. 前端通过ajax请求一次性上传多张图片到后台
  12. 日常开发中,String类中常用的方法
  13. c语言求正弦余弦正切,公式( 正弦 余弦 正切 余切 正割 余割 )
  14. b2b平台和b2b网站一样吗?B2B是什么意思?
  15. Java阿拉伯数字转换为中文大写
  16. 软件测试之-集成测试
  17. MAC通过ZOC远程访问Linux
  18. 3dmax和python做3d动画_maya三维动画师和程序员(python)哪个前景好一些?
  19. jetson xavier nx平台 Gstreamer tcpserverink延迟问题调试记录1
  20. 17Joys CMS企业网站管理系统 v1.0

热门文章

  1. SAP PI 业务处理引擎
  2. SAP MM ME55 不能批量审批部分多个PR?
  3. 计算距离torch.nn.PairwiseDistance
  4. 超易懂的MapReduce思想讲解
  5. 从1G到5G,从回顾过去到展望未来
  6. 《2020城市大脑全球标准研究报告》全文正式开放申领
  7. 一文看懂BATH新基建:5G是基础,AI是内核
  8. 生物战教训、生物安全问题以及未来监控军民两用生物技术扩散的手段
  9. 关于自动驾驶汽车法律政策的十点思考
  10. 谷歌、亚马逊、微软、IBM…这些巨头都已如何通过AI赚到钱了?