浏览 5123 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-04-09
最后修改:2012-04-09
本来只用了cxf的框架,没有使用cxf提供的工具,比如wsdl2java等 这种方式比较简单,主要是根据得到的wsdl文件,手工写接口类以及model类。详细说明见另外一篇博客:http://kyfxbl.iteye.com/blog/1432952 不过发现这种方式生成的wsdl,和原始的wsdl文件有些不一样,担心真正联调的时候跑不通,所以准备了另一套替代方案,就是用wsdl2java工具,来生成代码,保证wsdl完全一致 1、首先用wsdl2java命令,生成所需的java文件,当然前提是已经得到了wsdl文件 wsdl2java -p com.huawei.wfm.czekh.webservice.remedy -d ../../src/remedy -all fileName.wsdl 用上面这个命令,就可以根据wsdl文件,生成所需的所有java文件,参数说明如下: -p 指定生成java文件的package name -d 生成java文件的存放路径 -all 生成客户端和服务端代码,这里还可以用-client生成客户端,用-server生成服务端,不过实际上区别不大,只要用-all就可以了 最后一个参数就是目标wsdl文件 2、查看生成的文件列表,可以看到有以下文件: 大部分都是model类,可以不管。以下文件是比较特殊的: ObjectFactory.java package-info.java 这2个文件我也不知道是干嘛的,不过反正是不能删的 以_Client结尾的那个文件,是一个客户端,没有用,可以删除 以_Server结尾的那个文件,是启动服务端(貌似是内置的jetty),没有用,可以删除 以Service结尾的那个文件,不但没有用,还要坏事,因为其中有以下代码: @WebServiceClient(name = "CIP-B2B_ServiceAssuranceWorkForceClientManagementService", wsdlLocation = "file:CIP-B2B_ServiceAssuranceWorkForceClientManagement.wsdl", targetNamespace = "http://cz.o2.com/systems/integrationinfrastructure/CIP-B2B/CIP-B2B_ServiceAssuranceWorkForceClientManagement/1.0") 里面有一个"file:CIP-B2B_ServiceAssuranceWorkForceClientManagement.wsdl",因为这些类是根据一个本地的wsdl文件生成的,但是实际部署的时候一般不会放这个文件,所以在加载cxf配置的时候,是会出错的 实际上试验发现,这个文件可以直接删掉 以PortType结尾的文件,很关键,是接口类 以PortTypeImpl结尾的文件,是接口类的实现类,其中也有一行注解: @javax.jws.WebService( serviceName = "CIP-B2B_ServiceAssuranceWorkForceClientManagementService", portName = "CIP-B2B_ServiceAssuranceWorkForceClientManagementPort", targetNamespace = "http://cz.o2.com/systems/integrationinfrastructure/CIP-B2B/CIP-B2B_ServiceAssuranceWorkForceClientManagement/1.0", wsdlLocation = "file:CIP-B2B_ServiceAssuranceWorkForceClientManagement.wsdl", endpointInterface = "com.huawei.wfm.czekh.webservice.remedy.CIPB2BServiceAssuranceWorkForceClientManagementPortType") 要把这里的 wsdlLocation = "file:CIP-B2B_ServiceAssuranceWorkForceClientManagement.wsdl", 删除 所以在用wsdl2java命令生成java类之后,只需要把XXXService.java、XXX_Client.java、XXX_Server.java删除,把XXXPortTypeImpl.java改一下,就能用了 然后如果是要做客户端的话,就把除了XXXPortTypeImpl.java以外的所有文件拷贝到工程里;如果是做服务端的话,就把所有文件拷贝到工程里,然后根据实际情况修改XXXPortTypeImpl.java就可以了 3、最后是cxf的配置文件,这里和http://kyfxbl.iteye.com/blog/1432952提到的方式是一样的,没有区别 首先是服务端: <?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:context="http://www.springframework.org/schema/context" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <context:component-scan base-package="com.huawei.wfm.czekh" /> <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" /> <jaxws:endpoint id="remedy" implementor="#MyWebserviceServer" address="/RemedyWebService" /> </beans> @Component("MyWebserviceServer") @WebService(serviceName = "CIP-B2B_ServiceAssuranceWorkForceClientManagementService", portName = "CIP-B2B_ServiceAssuranceWorkForceClientManagementPort", targetNamespace = "http://cz.o2.com/systems/integrationinfrastructure/CIP-B2B/CIP-B2B_ServiceAssuranceWorkForceClientManagement/1.0", endpointInterface = "com.huawei.wfm.czekh.webservice.remedy.CIPB2BServiceAssuranceWorkForceClientManagementPortType") public class CIPB2BServiceAssuranceWorkForceClientManagementPortTypeImpl implements CIPB2BServiceAssuranceWorkForceClientManagementPortType { @Autowired private Test test; // 省略无关方法 public AcknowledgeResponse acknowledge( AcknowledgeRequest body) { test.sayHi("somebody"); AcknowledgeResponseBody responseBody = new AcknowledgeResponseBody(); responseBody.setStatus(true); responseBody.setErrorDescription("wcnm"); AcknowledgeResponse result = new AcknowledgeResponse(); result.setResponseBody(responseBody); return result; } } 可以看到,配置方式没有变化,也可以用spring进行依赖注入 然后是客户端: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:webservice_address.properties</value> </list> </property> </bean> <jaxws:client id="client" serviceClass="com.huawei.wfm.remedy.CIPB2BServiceAssuranceWorkForceClientManagementPortType" address="${remedy_address}" /> </beans> public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "cxf.xml"); CIPB2BServiceAssuranceWorkForceClientManagementPortType client = (CIPB2BServiceAssuranceWorkForceClientManagementPortType) context .getBean("client"); AcknowledgeRequestBody body = new AcknowledgeRequestBody(); body.setCustSysId("123456"); AcknowledgeRequest request = new AcknowledgeRequest(); request.setRequestBody(body); AcknowledgeResponse response = client.acknowledge(request); String desc = response.getResponseBody().getErrorDescription(); System.out.println(desc); } } 客户端的配置也是一样的。有一点要注意,好像只能通过getBean("client")拿到实例化的bean,通过@Autowired可能是搞不定的 4、自动生成的代码,当然是冗余很多的。有时间的话,可以手工进行清理 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-04-11
楼主那个java类名 感觉是我见过最长的类名了、、、
|
|
返回顶楼 | |
发表时间:2012-04-11
文件名太长,在windows下会出问题的
|
|
返回顶楼 | |
发表时间:2012-04-11
楼主华为外包?
|
|
返回顶楼 | |
发表时间:2012-04-11
为啥觉得我是外包。。
|
|
返回顶楼 | |
发表时间:2012-04-11
楼主,在江门?
|
|
返回顶楼 | |
发表时间:2012-04-12
最后修改:2012-04-12
好恐怖的文件清单列表啊 |
|
返回顶楼 | |
发表时间:2012-04-12
com.huawei.wfm 深深的出卖了你
|
|
返回顶楼 | |