spring项目在idea中最简单的调用webservice接口方法

本文介绍了一种无需配置额外框架,直接使用IDEA生成的代码调用WebService接口的方法。通过解析wsdl文件自动生成接口和服务类,实现了客户端直接调用WebService的功能。
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.youkuaiyun.com/wohaqiyi/article/details/85330808

  很长时间不调用webservice接口了,记得当初调webservice的时候,还要结合CxfXFire等框架。但是今天忽然给我一个这样的第三方wsdl地址,需要推送数据。
  难道还要配置webservice框架吗?费那么大劲,最后就调一个接口。

在这里插入图片描述
  然后,我本着执着的思想,坚决不配置webservice的东西,就要调通这个接口。最后真的发现了。真的太方便了。。。

具体步骤
1、第三方提供的接口文档

  调过webservice接口的同学们,肯定知道,接口提供方会给出一个类似http://123.21.11.223:19080/project-uniform-code-service?wsdl这样的地址。然后再配一个接口文档,比如下边:
在这里插入图片描述
  对,没毛病,这就是正常的提供,因为webservice的调用时,需要根据给的wsdl地址,自己来生成里边的接口等调用接口所需要的类。
  我们根据wsdl地址生成所需接口的代码,方式很多。可以用jdk自带的wsimport,我是用的idea开发工具生成的。主要介绍它的办法。

2、idea根据wsdl生成接口代码

  首先你要确定你要确定将代码生成在哪里。比如我打算在我新建的webservice文件夹里生成代码,那右击webservice文件夹,如下:
在这里插入图片描述
  如上图,点击Genarate Java Code From Wsdl... ,弹出如下页面,进行如下填写:
在这里插入图片描述
  填写完成后,点击ok,即可在文件夹里生成很多类,其中包含一些class文件,删掉class文件,具体如下:
在这里插入图片描述
  到这里,生成代码的步骤就完成了。

3、客户端调用接口

  首先我要按照上边,第三方提供的文档,找到要求我调用的那个方法,它就在生成的第一个接口里:

@WebService(name = "IProjectUniformCodeService", targetNamespace = "http://service.exchange.gfm.glodon")
@XmlSeeAlso({
    ObjectFactory.class
})
public interface IProjectUniformCodeService {
<span class="token comment">/**
 * 
 * @param uniformCodeJournalReceiveBean
 * @return
 *     returns cloud.user.service.webservice.UniformCodeResponse
 */</span>
<span class="token annotation punctuation">@WebMethod</span>
<span class="token annotation punctuation">@WebResult</span><span class="token punctuation">(</span>targetNamespace <span class="token operator">=</span> <span class="token string">""</span><span class="token punctuation">)</span>
<span class="token annotation punctuation">@RequestWrapper</span><span class="token punctuation">(</span>localName <span class="token operator">=</span> <span class="token string">"projectUniformMethodService"</span><span class="token punctuation">,</span> targetNamespace <span class="token operator">=</span> <span class="token string">"http://service.exchange.gfm.glodon"</span><span class="token punctuation">,</span> className <span class="token operator">=</span> <span class="token string">"cloud.user.service.webservice.ProjectUniformMethodService"</span><span class="token punctuation">)</span>
<span class="token annotation punctuation">@ResponseWrapper</span><span class="token punctuation">(</span>localName <span class="token operator">=</span> <span class="token string">"projectUniformMethodServiceResponse"</span><span class="token punctuation">,</span> targetNamespace <span class="token operator">=</span> <span class="token string">"http://service.exchange.gfm.glodon"</span><span class="token punctuation">,</span> className <span class="token operator">=</span> <span class="token string">"cloud.user.service.webservice.ProjectUniformMethodServiceResponse"</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> UniformCodeResponse <span class="token function">projectUniformMethodService</span><span class="token punctuation">(</span>
    <span class="token annotation punctuation">@WebParam</span><span class="token punctuation">(</span>name <span class="token operator">=</span> <span class="token string">"uniformCodeJournalReceiveBean"</span><span class="token punctuation">,</span> targetNamespace <span class="token operator">=</span> <span class="token string">""</span><span class="token punctuation">)</span>
    UniformCodeJournalReceiveBean uniformCodeJournalReceiveBean<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

  但它是一个接口,我也没法获取到它的实体,怎么点到这个方法呢?反正我决定,不会去合webservice框架的,再看看其他的文件吧。
  生成的时候,觉得生成的内容里,有很多感觉不知道是些什么东西的文件,后来我就点开了看了下。这一看我恍然大悟。。。
在这里插入图片描述
  比如生成的文件中的第二个文件,为什么名字叫的那么奇怪,**ServiceService ,点开后,我发现了如下的代码:

 static {
        URL url = null;
        WebServiceException e = null;
        try {
            url = new URL("http://123.21.11.223:19080/project-uniform-code-service?wsdl");
        } catch (MalformedURLException ex) {
            e = new WebServiceException(ex);
        }
        IPROJECTUNIFORMCODESERVICESERVICE_WSDL_LOCATION = url;
        IPROJECTUNIFORMCODESERVICESERVICE_EXCEPTION = e;
    }

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

更重要的是它继承了javax.xml.ws.Service

@WebServiceClient(name = "IProjectUniformCodeServiceService", targetNamespace = "http://service.exchange.gfm.glodon", 
wsdlLocation = "http://123.21.11.223:19080/project-uniform-code-service?wsdl")
public class IProjectUniformCodeServiceService
    extends Service
{

 
  • 1
  • 2
  • 3
  • 4
  • 5

  此处的代码有情况啊。。哈哈。无缘无故new URL,还是我要调的接口地址,这明显是在调用接口嘛。这很明显了。肯定会有后续步骤。
  在本类里我又继续往下找,看到了如下代码:

 @WebEndpoint(name = "IProjectUniformCodeServicePort")
    public IProjectUniformCodeService getIProjectUniformCodeServicePort() {
        return super.getPort(new QName("http://service.exchange.gfm.glodon", 
        "IProjectUniformCodeServicePort"), IProjectUniformCodeService.class);
    }

 
  • 1
  • 2
  • 3
  • 4
  • 5

  为什么我注意到这个接口呢?因为在上边已经贴出来了,就是该接口里,有我要调用的方法,我前边因为它是接口没法new出来,这里却返回了这个。
在这里插入图片描述
  缺啥给啥,“对象“”有了。。。哈哈
  最后我赶紧写了一个main方法,内容如下:

 IProjectUniformCodeServiceService serviceService = new IProjectUniformCodeServiceService();
IProjectUniformCodeService codeService = serviceService.getIProjectUniformCodeServicePort();
UniformCodeResponse uniformCodeResponse = codeService.projectUniformMethodService(receiveBean);
 if(uniformCodeResponse != null){
     if("200".equals(uniformCodeResponse.getCode())){
         return uniformCodeResponse.getUniformCodeJournalReturn().getUnifiedDealCode();
     }
 }

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  上边的receiveBean是个实体类,即要求我给他把参数封装成的对象,这个好理解,我把它省略没贴出来,我就这么写完,接口一调,果然通了。
在这里插入图片描述

  原来wsdl生成的类里,已经有了客户端直接调用接口的方法。

  其实上边可以写的再好点,生成类里还有个ObjectFactory类,该类是所需类的一个工厂类,可以拿到具体的要用的类。我后来也改成了用它调用。

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet">
                </div>
</article>
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值