很长时间不调用webservice接口了,记得当初调webservice的时候,还要结合Cxf、XFire等框架。但是今天忽然给我一个这样的第三方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>
本文介绍了一种无需配置额外框架,直接使用IDEA生成的代码调用WebService接口的方法。通过解析wsdl文件自动生成接口和服务类,实现了客户端直接调用WebService的功能。
9196





