如何利用jdk自带的工具apache cxf生成客户端CXF服务的客户端

本帖子已过去太久远了,不再提供回复功能。JDK自带工具keytool生成ssl证书 - 小二丶 - 博客园
随笔 - 2, 文章 - 1, 评论 - 1, 引用 - 0
JDK自带工具keytool生成ssl证书
因为公司项目客户要求使用HTTPS的方式来保证数据的安全,所以木有办法研究了下怎么生成ssl证书来使用https以保证数据安全。
百度了不少资料,看到JAVA的JDK自带生成SSL证书的工具:keytool,外加看了同事的心得体会,自己总结了一下具体的使用方法和使用过程中发现的问题及解决办法。
1:什么是HTTPS?
HTTPS其实是有两部分组成:HTTP&+&SSL&/&TLS,
也就是在HTTP上又加了一层处理加密信息的模块,并且会进行身份的验证。
Firebug和postman之类的浏览器调试工具,为什么获取到的是明文?
SSL是对传输的数据进行加密,针对的是传输过程的安全。&
firebug之类的浏览器调试工具,
因为他们得到的是客户端加密之前/解密之后的数据,因此是明文的。
2:什么是自签名证书?
就是自己生成的证书,并不是官方生成的证书。
除非是很正式的项目,否则使用自己签发的证书即可,因为官方生成证书是要花钱滴。
3:进入正题,使用JDK自带工具KeyTool&生成自签发证书!
第一步:为服务器生成证书
打开CMD命令行工具,cd到C盘根目录或者是jdk的bin目录下,如下图所示:
使用keytool命令生成证书:
-alias&tomcat(别名)&
-keypass&123456(别名密码)&
-keyalg&RSA(算法)&
-keysize&1024(密钥长度)&
-validity&365(有效期,天单位)&
-keystore&D:/keys/tomcat.keystore(指定生成证书的位置和证书名称)&
-storepass&123456(获取keystore信息的密码)
方便复制版:
keytool&-genkey&-alias&tomcat&-keypass&123456&-keyalg&RSA&-keysize&1024&-validity&365&-keystore&D:/keys/tomcat.keystore&-storepass&123456
回车执行后如下图:
点击回车即可在D:/keys/文件夹内生成名为:tomcat.keystore的文件。
成功后无提示信息
①D:/keys/&目录需要提前手动创建好,否则会生成失败
②提示输入域名的时候不能输入IP地址
问题①的错误信息如下:
第二步:为客户端生成证书
为浏览器生成证书,以便让服务器来验证它。
为了能将证书顺利导入至IE和Firefox,证书格式应该是PKCS12,
因此,使用如下命令生成:
-alias&client&
-keypass&123456
-keyalg&RSA&
-storetype&PKCS12&
-keypass&123456&
-storepass&123456&
-keystore&D:/keys/client.p12
方便复制版:
keytool&-genkey&-alias&client1&-keypass&123456&-keyalg&RSA&-keysize&1024&-validity&365&-storetype&PKCS12&-keystore&D:/keys/client1.p12&-storepass&123456
第二步余下操作步骤同第一步。
第三步:让服务器信任客户端证书
由于不能直接将PKCS12格式的证书库导入,
必须先把客户端证书导出为一个单独的CER文件,使用如下命令:
keytool&-export&-alias&client&-keystore&D:/keys/client.p12&-storetype&PKCS12&-keypass&123456&-file&D:/keys/client.cer
Keypass:指定CER文件的密码,但会被忽略,而要求重新输入
将该文件导入到服务器的证书库,添加为一个信任证书:
keytool&-import&-v&-file&D:/keys/client.cer&-keystore&D:/keys/tomcat.keystor
e&-storepass&123456
完成之后通过list命令查看服务器的证书库,
可以看到两个证书,一个是服务器证书,一个是受信任的客户端证书:
keytool&-list&-v&-keystore&D:/keys/tomcat.keystore
第四步:让客户端信任服务器证书
由于是双向SSL认证,客户端也要验证服务器证书,
因此,必须把服务器证书添加到浏览器的&受信任的根证书颁发机构&。
由于不能直接将keystore格式的证书库导入,
必须先把服务器证书导出为一个单独的CER文件,使用如下命令:
keytool&-keystore&D:/keys/tomcat.keystore&-export&-alias&tomcat6&-file&D:/keys/server.cer
双击server.cer文件,按照提示安装证书,
将证书填入到&受信任的根证书颁发机构&。
填入方法:
打开浏览器&&&-&工具&&-&&internet选项-内容-&证书-把中级证书颁发机构里的(该名称即时你前面生成证书时填写的名字与姓氏)证书导出来-再把导出来的证书导入&&受信任的根颁发机构&&就OK了。
第五步:配置Tomcat服务器
&Connector& port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"&SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
clientAuth="true"
sslProtocol="TLS"
keystoreFile="D:/keys/tomcat.keystore"
keystorePass="123456"
truststoreFile="D:/keys/tomcat.keystore"
truststorePass="123456"&/&
属性说明:
clientAuth:设置是否双向验证,默认为false,设置为true代表双向验证
keystoreFile:服务器证书文件路径
keystorePass:服务器证书密码
truststoreFile:用来验证客户端证书的根证书,此例中就是服务器证书
truststorePass:根证书密码
①&设置clientAuth属性为True时,需要手动导入客户端证书才能访问。
②&要访问https请求&需要访问8443端口,访问http请求则访问Tomcat默认端口(你自己设置的端口,默认8080)即可。
经过以上五步,你使用HTTPS&端口为8443&进行访问的时候&就是经过SSL信息加密,不怕被截获了。
通话的双方,必须是都拥有证书的端,才能进行会话,换句话说,就是只有安装了咱证书的客户端,才能与服务器通信。
强制&https&访问
在&tomcat&/conf/web.xml&中的&&/welcome-&file-list&&后面加上这
&login-config&&&&&
&!--&Authorization&setting&for&SSL&--&&&&&
&auth-method&CLIENT-CERT&/auth-method&&&&&
&realm-name&Client&Cert&Users-only&Area&/realm-name&&&&&
&/login-config&&&&&
&security-constraint&&&&&
&!--&Authorization&setting&for&SSL&--&&&&&
&web-resource-collection&&&&&&
&web-resource-name&&SSL&/web-resource-name&&&&&
&url-pattern&/*&/url-pattern&&&&&
&/web-resource-collection&&&&&
&user-data-constraint&&&&&
&transport-guarantee&CONFIDENTIAL&/transport-guarantee&&&&&
&/user-data-constraint&&&&&
&/security-constraint&&
完成以上步骤后,在浏览器中输入http的访问地址也会自动转换为https了。
keytool常用命令&
-alias&&&&&&&产生别名&
-keystore&&&&指定密钥库的名称(就像数据库一样的证书库,可以有很多个证书,cacerts这个文件是jre自带的,&
&&&&&&&&&&&&&你也可以使用其它文件名字,如果没有这个文件名字,它会创建这样一个)&
-storepass&&&指定密钥库的密码&
-keypass&&&&&指定别名条目的密码&
-list&&&&&&&&显示密钥库中的证书信息&
-v&&&&&&&&&&&显示密钥库中的证书详细信息&
-export&&&&&&将别名指定的证书导出到文件&
-file&&&&&&&&参数指定导出到文件的文件名&
-delete&&&&&&删除密钥库中某条目&
-import&&&&&&将已签名数字证书导入密钥库&
-keypasswd&&&修改密钥库中指定条目口令&
-dname&&&&&&&指定证书拥有者信息&
-keyalg&&&&&&指定密钥的算法&
-validity&&&&指定创建的证书有效期多少天&
-keysize&&&&&指定密钥长度&
使用说明:&
导入一个证书命令可以如下:&
keytool&-import&-keystore&cacerts&-storepass&666666&-keypass&888888&-alias&alibabacert&-file&C:\alibabajava\cert\test_root.cer&
其中-keystore&cacerts中的cacerts是jre中默认的证书库名字,也可以使用其它名字&
-storepass&666666中的666666是这个证书库的密码&
-keypass&888888中的888888是这个特定证书的密码&
-alias&alibabacert中的alibabacert是你导入证书的别名,在其它操作命令中就可以使用它&
-file&C:\alibabajava\cert\test_root.cer中的文件路径就是要导入证书的路径&
浏览证书库里面的证书信息,可以使用如下命令:&
keytool&-list&-v&-alias&alibabacert&-keystore&cacerts&-storepass&666666&
要删除证书库里面的某个证书,可以使用如下命令:&
keytool&-delete&-alias&alibabacert&-keystore&cacerts&-storepass&666666&
要导出证书库里面的某个证书,可以使用如下命令:&
keytool&-export&-keystore&cacerts&-storepass&666666&-alias&alibabacert&-file&F:\alibabacert_root.cer&
要修改某个证书的密码(注意:有些数字认证没有私有密码,只有公匙,这种情况此命令无效)&
这个是交互式的,在输入命令后,会要求你输入密码&
keytool&-keypasswd&-alias&alibabacert&-keystore&cacerts&
这个不是交互式的,输入命令后直接更改&
Keytool&-keypasswd&-alias&alibabacert&-keypass&888888&-new&123456&-storepass&666666&-keystore&cacerts
撰写日期:日&
撰写人:张之彬温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
项目名:InterfaceContorlAPP
src下面,主要有config、dao、service、webapp 、applicationContext.xml 及资源文件等。
我在在现有项目中进行开发和调试,CXF用到的包在apache-cxf-2.6.1.gz&中都有。我大概根据项目中现有的包分析了一下,至少 要有:&&
&&&&&&以上也是我项目中用到的全部包。
2、新增WebService接口和实现类
&&&& 在service 包下新建webservice包,主要区别与其他文件。
&&&&&接口里面定义了两个方法 ,我都和数据库、表有关系,大家在测试时,可以写的简单些,
&&& 如:在方法 里只写一句打印之类。
&&&&&接口名:DemoForWebService
&&&&&源码:
package service.
import javax.jws.WebMimport javax.jws.WebPimport javax.jws.WebRimport javax.jws.WebSimport javax.jws.soap.SOAPB
import dao.code.model.U
//ZBY @WebService(targetNamespace = "")@SOAPBinding&& public interface DemoForWebService {
&@WebResult(name = "Message_Return",targetNamespace = "", partName = "Message_Return")&@WebMethod(operationName = "getUserById", action = "")
&//示例&&& public User getUserById(@WebParam(name = "xtczdm") String xtczdm) throws E&public String updateUserByCmd(User user) throws E
实现类继续上面的接口:DemoForWebServiceImpl
package service.webservice.
import javax.jws.WebSimport javax.sql.DataS
import dao.code.model.U
import service.code.UserSimport service.webservice.DemoForWebS
/** &* @author 作者 ZBY E-mail: &* @version 创建时间: 上午09:57:46 &* 类说明 &*/@WebService(endpointInterface = "service.webservice.DemoForWebService",targetNamespace="")
public class DemoForWebServiceImpl implements DemoForWebService {&private DataSource dataS//数据源&&& private UserService userS//我用到的对象对应的serivce,主要用于下面对数据库的访问&public User getUserById(String xtczdm) throws Exception {&&// TODO Auto-generated method stub&&User user = userService.findUserByXtczdm(xtczdm);&&&}
&public String updateUserByCmd(User user) throws Exception {&&// TODO Auto-generated method stub&&String result = "True";&&String xtczdm = user.getXtczdm();&&User u = userService.findUserByXtczdm(xtczdm);&&&&&&&&& if(u!=null){&&&&&&& &u.setXtczkl(user.getXtczkl());&&& &&userService.persistUser(u);&&&&&&& &result = u.getXtczkl();&&&&&&& }else{&&&&&&& &result ="false";&&&&&&& }&&&}
&public DataSource getDataSource() {&&return dataS&}
&public void setDataSource(DataSource dataSource) {&&this.dataSource = dataS&}
&public UserService getUserService() {&&return userS&}
&public void setUserService(UserService userService) {&&this.userService = userS&}
}3、配置文件
&&&&&(1)我在 config包下单独建了一个webservice的配置文件,beanRef-service-webservice.xml
&&&& 源码:
&&&& &?xml version="1.0" encoding="UTF-8"?&&beans xmlns=""&&xmlns:xsi=""&&xmlns:context=""&&xmlns:tx=""&&xmlns:dwr=""&&xmlns:jaxws=""&&xsi:schemaLocation=" && && &&&&& &&&& & "& &&& &&&&import resource="classpath:META-INF/cxf/cxf.xml" /&&&import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /&&&import resource="classpath:META-INF/cxf/cxf-servlet.xml" /&
&&&context:annotation-config /&&&&&& &!--&为刚建的接口 配置spring配置文件 bean id = 接口名的首字母缩写,这是我们公司规范,呵呵。
&&&&&&&&&& 请注意的时,这个ID 将是下面配置webserivce endpoint 中implementor 要引用的值。
& --&&&&bean id="demoForWebService" parent="baseTransactionProxy"&&&&property name="proxyTargetClass" value="true" /&&&&property name="target"&&&&&bean class="service.webservice.impl.DemoForWebServiceImpl"&&&&&&&&property name="dataSource" ref="dataSource"/&&!-- 对比这两个属性,和实现类中引用的两个对象是一样的。spring配置大家还是根据自己的规范来--&&&&&&property name="userService" ref="UserService"/&&&&&&/bean&&&&/property&&&/bean&&&!--&
&&jaxws:endpoint id="demoForWebSerivceWebSerivce" implementor="service.webservice.impl.DemoForWebSerivceImpl" address="/demoForWebSerivce" /&&--&&&jaxws:endpoint id="demoForWebServiceWebService" implementor="#demoForWebService" address="/demoForWebService" /&&&!-- implementor = 接口bean 的id
&&&&&&& address& =&url访问时的路径&&&&&&
--&&&/beans&
(2)要把(1)生成的文件,加入到applicationContext.xml,这主要是Spring的要求
&import resource="config/beanRef-service-webservice.xml" /&
(3)在你的web.xml文件中增加如下内容:
&servlet&&& &&&&&&& &servlet-name&CXFServlet&/servlet-name&&& &&&&&&& &servlet-class&org.apache.cxf.transport.servlet.CXFServlet&/servlet-class&&& &&&&&&& &load-on-startup&1&/load-on-startup&&& &&& &/servlet&&& &&&& &servlet-mapping&&& &&&&&&& &servlet-name&CXFServlet&/servlet-name&&& &&&&&&& &url-pattern&/webservice/*&/url-pattern&&& &&& &/servlet-mapping&
红色部分在后面的URL中要用到。
4、测试是否配置成功
&&&& 启动项目后,使用url访问。
&&&& 这是我的访问URL:
&&&& :端口号/项目访问名/web中配置url-pattern/beanRef-service-webservice.xml配置的address?wsdl
&5、客户端调用
&&&& 我主要是通过写main调用
&&&&& 方法一:使用cxf 写客户端调用
&&&& 在common包下新增clientWS.java
import java.beans.PropertyDimport java.net.URL;import java.util.L
import javax.xml.namespace.QN
import org.apache.cxf.binding.corba.wsdl.ObjectFimport org.apache.cxf.endpoint.Cimport org.apache.cxf.endpoint.Eimport org.apache.cxf.jaxws.JaxWsProxyFactoryBimport org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFimport org.apache.cxf.service.Simport org.apache.cxf.service.model.BindingIimport org.apache.cxf.service.model.BindingMessageIimport org.apache.cxf.service.model.BindingOperationIimport org.apache.cxf.service.model.MessagePartIimport org.apache.cxf.service.model.ServiceI
import dao.code.model.U
import service.webservice.DemoForWebSimport service.webservice.impl.DemoForWebServiceI&&
/** &* @author 作者 E-mail: &* @version 创建时间: 下午01:46:47 &* 类说明&& &*/
public class clientWS {&&&&&& public static void main(String args[]) throws Exception {&& &&&& &&& &&&& &/*& &&&& & * 方法三*/&&&& && JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();&&&&& && // 注册WebService接口&&&&&& && factory.setServiceClass(DemoForWebService.class);&&&&& && // 设置WebService地址&&&&&& && factory.setAddress("");&&&&&& && DemoForWebService dfw = (DemoForWebService) factory.create();&&&&& && System.out.println("invoke webservice...");&&&&&& && String xtczdm ="admin";&&&& && //根据操作代码得到用户&&&&User user = dfw.getUserById(xtczdm);&&&& && if(user != null){&&&&&WebLogs.getLogger().info("user is not null!");&&&&&//修改用户密码&&&&&user.setXtczkl("test");&&&&&String result = dfw.updateUserByCmd(user);&&&&&WebLogs.getLogger().info("新密码:"+result);&&&&}else{&&&&&WebLogs.getLogger().info("NULL !");&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&
}运行成功后:
&方法二:使用wsdl2java生成客户端
1、需要 一个包:apache-cxf-2.6.1.gz
这个包里有好多jar包,一定要下载下来。
将此包解压,我是放在:E:\CXF\apache-cxf-2.6.1
2、将URL调用成功的页面内容,另存为XML
&3、在cmd中通过wsdl2java生成客户端文件
cd 进入apache-cxd-2.6.1\bin目录
执行命名:
wsdl2java -p service.webservice.client.demo -d F:\MyDocuments\Java\ws\InterfaceControlApp\src -verbose "F:\demoForWebSerivce.xml"
wsdl2java -p 包名 -d 生成文件路径 -verbose "wsdl文件路径"&然后再拷贝到项目里
包名:文件存放的包名,可以写项目中包路径 生成文件路径 :文件存放路径,可以直接写项目路径wsdl文件:在IE中执行服务端URL显示的XML另存为XML文件。&我是直接到项目路径了,生成前:
&报错处理:
4、写MAIN调用
import javax.xml.ws.S
import service.webservice.client.demo.DemoForWebSimport service.webservice.client.demo.DemoForWebServiceImplSimport service.webservice.client.demo.U
/** &* @author 作者 E-mail: &* @version 创建时间: 下午03:39:29 &* 类说明 &*/
public class TestWSClientByZBY {
&/**& * @param args& */&public static void main(String[] args) {&&// TODO Auto-generated method stub&&Service service = Service.create(DemoForWebServiceImplService.SERVICE);&&
&&String endpointAddress = "";&&service.addPort(DemoForWebServiceImplService.HTTPPort, javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);&&//&DMSSender dms = service.getPort(DMSSender.class);&&DemoForWebService dms = service.getPort(DemoForWebServiceImplService.HTTPPort,DemoForWebService.class);&& U&&try {&&&user = dms.getUserById("admin");&&&System.out.println(user.getXtczdm());&&} catch (Exception e) {&&&// TODO Auto-generated catch block&&&e.printStackTrace();&&}
在服务端的实现类中@WebService(endpointInterface = "service.webservice.DemoForWebService",targetNamespace="")成功后:
调用完成。
阅读(34428)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'java cxf webservice 生成客户端 调用 服务端',
blogAbstract:'&我的项目环境:eclipse 、SSH框架\r\n最近在学习webserivce在java的使用,做了一个小例子。\r\n1、我的项目结构\r\n&&&&& \r\n\r\n项目名:InterfaceContorlAPP\r\nsrc下面,主要有config、dao、service、webapp 、applicationContext.xml 及资源文件等。\r\n2、包\r\n我在在现有项目中进行开发和调试,CXF用到的包在apache-cxf-2.6.1.gz&中都有。我大概根据项目中现有的包分析了一下,至少 要有:&&\r\n',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:5,
publishTime:3,
permalink:'blog/static/',
commentCount:7,
mainCommentCount:4,
recommendCount:2,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}4903人阅读
在用到web service时,如果是调用自己开发的web service还好,可以有一个方法的接口或参数对象实体类什么的,但如果是调用第三方的服务,除了得到web service服务地址的wsdl文档外,没有任何实质性编码的东西,写原生调用太麻烦,这时就需要自己写一个方法的接口类。
这个,目前已经有比较成熟的工具,可以自动生成,下面作一下简单的介绍。
apache的wsdl2java工具,目前貌似CXF和axis各有一套,使用方式大同小异,但生成的代码会有所区别,这时说的是CXF提供的wsdl2java工具。
wsdl2java用法:
wsdl2java -p com -d src -all& aa.wsdl
-p& 指定其wsdl的命名空间,也就是要生成代码的包名:
-d& 指定要产生代码所在目录
-client 生成客户端测试web service的代码
-server 生成服务器启动web& service的代码
-impl 生成web service的实现代码
-ant& 生成build.xml文件
-all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
详细用法见:
一开始使用了CXF的这套工具,发现不是很方便,毕竟依赖CXF提供的工具jar包,个人不是很喜欢用。
后来发现JDK居然也自带了对web service生成java代码的功能,貌&#版本开始的,试用后发现效果十分不错,果断投入它的怀抱。下面作下简单的介绍,以备忘。
打开jdk下的bin目录 看下能否找到&wsimport.exe&这个文件
一般情况下都会有
如果没有则说明你的JDK不支持这个功能
然后在DOS窗口下输入wsimport 敲回车
如果提示错误的话 说明你的JDK环境变量还没有配好
一句话总结,如果你在dos窗口下输入wsimport正常,就可以
如果OK的话 输入以下命令就可以将wsdl文件生成java文件了
wsimport&& -keep -p com.llg.ws2 -s g:/ws
wsimport 这个是必须的 该工具的名称
& wsdl文件
-keep& 是否生成源文件
-p com.llg.ws2& 生成后的java包名
-s g:/ws&&& 生成后放哪个目录
但是前几天,在对一个第三方提供的web service使用该工具生成java代码的时候,居然出错了,网上查找后终于找到原因。
使用cxf wsdl2java或javax wsimport工具的时候,可能会遇到关于生成的Response类文件名冲突的问题&
Console代码&&
WSDLToJava&Error:&Thrown&by&JAXB&:&A&class/interface&with&the&same&name&&***&&is&already&in&use.&Use&a&class&customization&to&resolve&this&conflict.&&
目前可选择的方案:&
apache的wsdl2java工具,使用-autoNameResolution自动处理&
wsdl2java -autoNameResolution&&
JDK自带的工具
wsimport -p com.test.client -keep&&-B-XautoNameResolution&
2.如果web service是己方开发的,可以修改代码,使用自定义bindings,详细可看&
Java代码&&
public&interface&ValidateCCService&&&&&&@WebMethod&&&&&&@WebResult(name&=&&response&)&&&&&&public&ValidateCCResponse&validateCC(@WebParam(name&=&&request&)ValidateCCRequest&request);&&
这个情况下定义的方法名,如果使用工具生成客户端代码,很可能存在Response冲突,因为定义的wsdl中会有一个关于接口方法的message&
&wsdl:message name=&validateCCResponse&&&
&/wsdl:message&&
方法名定义的message与接口定义返回的ValidateCCResponse,在工具生成客户端代码时就会产生命名冲突。&
但是通过更改接口方法名为:&
Java代码&&
public&interface&ValidateCCService&&&&&&@WebMethod&&&&&&@WebResult(name&=&&response&)&&&&&&public&ValidateCCResponse&validate(@WebParam(name&=&&request&)ValidateCCRequest&request);&&
即可解决该冲突,&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:52248次
排名:千里之外
原创:19篇
转载:71篇
(2)(5)(4)(7)(1)(5)(2)(9)(2)(2)(5)(1)(3)(11)(2)(4)(1)(4)(2)(9)(4)(5)(1)}

我要回帖

更多关于 cxf https 客户端 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信