资讯专栏INFORMATION COLUMN

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

Arno / 3167人阅读

摘要:把上一篇文章生成的文件另存为,放到下面,没有改,文件也没有修改,只有配置文件改成了下面这个样子按照文档说明,此时访问就可以访问了。

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

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

遗留问题

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

这是soap ui生成的请求数据


   
   
      
         
         
            
            2017-05-05
            2017-05-05
         
         
            
            147
            156
            457
         
      
   

后台解析的代码:

 

    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修改了,不再和上一篇文章中的内容完全一样,这是修改后的文件:



    
        
            
                
                
            
        
    

    
        
            
            
        
    

    
        
            
            
            
        
    

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



    
        
            
                
                
            
        
    

    
        
            
            
        
    

    
        
            
            
            
        
    

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














还有很多

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

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

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

@Override
    public 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配置文件改成了下面这个样子:



    
    

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

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

java.lang.ClassNotFoundException: javax.wsdl.extensions.ExtensibilityElement
    at 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.(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,这是官方参考文档
其中关于依赖的配置如下:


    
        org.springframework.ws
        spring-ws-core
        
    
    
        jdom
        jdom
        2.0.1
    
    
        jaxen
        jaxen
        1.1
    

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

这是2.1.4版本:

这是最新版本:

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70149.html

相关文章

  • spring boot开发soap webservice

    摘要:本文介绍如何在中开发接口,以及接口如何同时支持和两种协议。该功能很简单,就是通过一个人的姓名查询这个人的详细信息。就是关键,如本次请求报文如下就是,对应。测试使用进行测试,通过地址导入文件进行测试。测试这样就实现了和同时提供的目的。 介绍spring boot web模块提供了RestController实现restful,第一次看到这个名字的时候以为还有SoapController,...

    Ashin 评论0 收藏0
  • WebService就是这么简单

    摘要:它使用方式,接收和响应外部系统的某种请求。回顾我们在学习基础网络编程章节已经知道了这么一个连接了。使用指定名称的命名空间。名词简单对象访问协议作为一个基于语言的协议用于有网上传输数据。以的根元素出现。代理这么一个概念就更加清晰了。 WebService介绍 首先我们来谈一下为什么需要学习webService这样的一个技术吧.... 问题一 如果我们的网站需要提供一个天气预报这样一个需求...

    SwordFly 评论0 收藏0
  • RPC框架是啥之Apache CXF一款WebService RPC框架入门教程

    摘要:支持相关规范和标准,包括同上。支持多种传输协议和协议绑定数据绑定。构建端还有其服务实现,接口使用注解,标明是一个远程服务接口。然后编写一个的启动程序,并运行,我想你会成功的因为我看到了下图是一种跨平台的技术协议。 本博客 猫叔的博客,转载请申明出处 学习系列 RPC框架是啥? RPC框架是啥之Java自带RPC实现,RMI框架入门 Apache CXF一款WebService RP...

    SolomonXie 评论0 收藏0
  • Java系统WebServiceSpring与CXF集成

    摘要:我们再使用这样的来查看这个服务具体的定义这个用以通过查看服务也就是我们开头所说的用通用格式来描述的功能入参和返回值,使我们的调用者明白服务的使用方法具体详情可以查看我们的这个服务的页面。 WebService是什么呢?顾名思义,是Web系统提供的服务,其目的呢,往大了说:是系统实现多异构模块协同合作,服务实现SOA(Services oriented Architecture面向服务的...

    waterc 评论0 收藏0
  • 实现一个spring webservice服务端三:实现一个有复杂返回值spring-ws服务

    摘要:,将类或枚举类型映射到模式类型,控制字段或属性的序列化。表示将自动绑定类中的每个非静态的非瞬态的由标注字段到。,对于数组或集合即包含多个元素的成员变量,生成一个包装该数组或集合的元素称为包装器。 在经过前面两篇文章的学习,我已经能够熟练创建一个正常运行的spring-ws的webservice服务,大多数接口,都是要有返回数据,所以这篇文章就是学习spring-ws怎么实现返回数据 实...

    xinhaip 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<