- 浏览: 1821805 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (665)
- 闲话 (17)
- ruby (1)
- javascript (40)
- linux (7)
- android (22)
- 开发过程 (11)
- 哥也读读源代码 (13)
- JVM (1)
- ant (2)
- Hibernate (3)
- jboss (3)
- web service (17)
- https (4)
- java基础 (17)
- spring (7)
- servlet (3)
- 杂记 (39)
- struts2 (10)
- logback (4)
- 多线程 (2)
- 系统诊断 (9)
- UI (4)
- json (2)
- Java EE (7)
- eclipse相关 (4)
- JMS (1)
- maven (19)
- 版本管理 (7)
- sso (1)
- ci (1)
- 设计 (18)
- 戒烟 (4)
- http (9)
- 计划 (4)
- HTML5 (3)
- chrome extensions (5)
- tomcat源码阅读 (4)
- httpd (5)
- MongoDB (3)
- node (2)
最新评论
-
levin_china:
勾选了,还是找不到
用spring annotation声明的bean,当打包在jar中时,无法被扫描到 -
GGGGeek:
我用的maven-3.5.0,还没有遇到这种情况,使用jar ...
用spring annotation声明的bean,当打包在jar中时,无法被扫描到 -
GGGGeek:
受益匪浅,从组织项目结构,到技术细节,讲的很到位,只是博主不再 ...
一个多maven项目聚合的实例 -
Aaron-Joe-William:
<?xml version="1.0" ...
hibernate逆向工程 -
li272355201:
http://archive.apache.org/dist/ ...
tomcat源码阅读(一)——环境搭建
这次开发web service对接,用的是cxf2.0.13
本来只用了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结尾的那个文件,不但没有用,还要坏事,因为其中有以下代码:
里面有一个"file:CIP-B2B_ServiceAssuranceWorkForceClientManagement.wsdl",因为这些类是根据一个本地的wsdl文件生成的,但是实际部署的时候一般不会放这个文件,所以在加载cxf配置的时候,是会出错的
实际上试验发现,这个文件可以直接删掉
以PortType结尾的文件,很关键,是接口类
以PortTypeImpl结尾的文件,是接口类的实现类,其中也有一行注解:
要把这里的
删除
所以在用wsdl2java命令生成java类之后,只需要把XXXService.java、XXX_Client.java、XXX_Server.java删除,把XXXPortTypeImpl.java改一下,就能用了
然后如果是要做客户端的话,就把除了XXXPortTypeImpl.java以外的所有文件拷贝到工程里;如果是做服务端的话,就把所有文件拷贝到工程里,然后根据实际情况修改XXXPortTypeImpl.java就可以了
3、最后是cxf的配置文件,这里和http://kyfxbl.iteye.com/blog/1432952提到的方式是一样的,没有区别
首先是服务端:
可以看到,配置方式没有变化,也可以用spring进行依赖注入
然后是客户端:
客户端的配置也是一样的。有一点要注意,好像只能通过getBean("client")拿到实例化的bean,通过@Autowired可能是搞不定的
4、自动生成的代码,当然是冗余很多的。有时间的话,可以手工进行清理
这并不是我们能控制的,是wsdl2java工具实现的
生成以后,你再自己手工去调整位置,这是强烈不推荐的。我可以理解你的想法,你希望它分类得更清楚一点,但是这些包和类的路径信息,都是在package-info里要用的,在生成的时候就已经规定了,你手工改以后,很可能会有问题
实际上,既然选择了wsdl2java的方式,还是就让工具自己去处理吧,你自己眼不见心不烦就好了
那么就是说,每个服务生成的类就放一个包里面是吧?不要再去调他的位置?因为服务太多了,服务端和客户端加起来有70多个
这并不是我们能控制的,是wsdl2java工具实现的
生成以后,你再自己手工去调整位置,这是强烈不推荐的。我可以理解你的想法,你希望它分类得更清楚一点,但是这些包和类的路径信息,都是在package-info里要用的,在生成的时候就已经规定了,你手工改以后,很可能会有问题
实际上,既然选择了wsdl2java的方式,还是就让工具自己去处理吧,你自己眼不见心不烦就好了
本来只用了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、自动生成的代码,当然是冗余很多的。有时间的话,可以手工进行清理
评论
9 楼
kyfxbl
2013-01-20
是的,生成以后原封不动搬过去就好
8 楼
konlin
2013-01-20
kyfxbl 写道
konlin 写道
我想问下 生成的这些java文件是怎么去分类呢?是一个服务就放一个包,还是把每个服务的bean类,接口或者实现类这样分开放呢?
这并不是我们能控制的,是wsdl2java工具实现的
生成以后,你再自己手工去调整位置,这是强烈不推荐的。我可以理解你的想法,你希望它分类得更清楚一点,但是这些包和类的路径信息,都是在package-info里要用的,在生成的时候就已经规定了,你手工改以后,很可能会有问题
实际上,既然选择了wsdl2java的方式,还是就让工具自己去处理吧,你自己眼不见心不烦就好了
那么就是说,每个服务生成的类就放一个包里面是吧?不要再去调他的位置?因为服务太多了,服务端和客户端加起来有70多个
7 楼
kyfxbl
2013-01-19
konlin 写道
我想问下 生成的这些java文件是怎么去分类呢?是一个服务就放一个包,还是把每个服务的bean类,接口或者实现类这样分开放呢?
这并不是我们能控制的,是wsdl2java工具实现的
生成以后,你再自己手工去调整位置,这是强烈不推荐的。我可以理解你的想法,你希望它分类得更清楚一点,但是这些包和类的路径信息,都是在package-info里要用的,在生成的时候就已经规定了,你手工改以后,很可能会有问题
实际上,既然选择了wsdl2java的方式,还是就让工具自己去处理吧,你自己眼不见心不烦就好了
6 楼
konlin
2013-01-19
我想问下 生成的这些java文件是怎么去分类呢?是一个服务就放一个包,还是把每个服务的bean类,接口或者实现类这样分开放呢?
5 楼
konlin
2013-01-19
我想问下 生成的这些java文件是怎么去分类呢?是一个服务就放一个包,还是把每个服务的bean类,接口或者实现类这样分开放呢?
4 楼
kyfxbl
2013-01-10
生成这么多类,因为这个服务的参数比较多
这个确实是个问题,我也不太喜欢。不过这个过程是自动的,并不需要你人工干预。生成的类,用户只需要关注接口,以及作为参数的模型类
其他类是用不到的
这个确实是个问题,我也不太喜欢。不过这个过程是自动的,并不需要你人工干预。生成的类,用户只需要关注接口,以及作为参数的模型类
其他类是用不到的
3 楼
konlin
2013-01-09
那么每一个服务都要生成这么多的类?是不是太庞大了啊?管理和查找都很麻烦呀
2 楼
kyfxbl
2012-06-11
这个也是无奈之举,因为WSDL是客户提供的,我们只能自动生成
然后生成以后又不好使,只好手工干预
不过WSDL是相对比较稳定的
然后生成以后又不好使,只好手工干预
不过WSDL是相对比较稳定的
1 楼
xiaguangme
2012-06-11
自动生成代码 手工干预后 会不会不太好?
当这个wsdl有变动 更新, 就要重新生成代码
那么手动更改的那部分代码就麻烦了
当这个wsdl有变动 更新, 就要重新生成代码
那么手动更改的那部分代码就麻烦了
发表评论
-
XML-RPC与web service
2013-06-05 12:44 2096前段时间公司的办公环 ... -
cxf集成spring,精简版
2012-08-15 17:40 2916上次总结了spring集成cxf的方法,不过有些地方说得不清楚 ... -
替换证书,造成bad_certificate
2012-05-14 21:47 5284系统调用外部的web service,走https方式,今天测 ... -
cxf配置http:conduit
2012-05-08 20:16 10780本次项目要通过https方式,调用外部的web service ... -
cxf生成endpoint,使用soap1.1和soap1.2
2012-04-25 23:31 3071开发了一个web service服务,客户居然不认,查看客户发 ... -
cxf配置方式实现日志和https请求
2012-04-21 01:21 7809这篇博客介绍一下怎么通过配置方式配置https和cxf的日志功 ... -
一次艰难的web service对接开发
2012-04-19 23:10 3689这次的需求是将我们的系统与一个客户系统对接,对接的方式是通过w ... -
根据已有的wsdl,开发web service的服务端和客户端
2012-04-11 23:13 18137折腾了好长时间,今天终于把这次web service对接的需求 ... -
cxf和spring集成的一些事
2012-03-30 20:31 6370环境: cxf-2.1.3,jdk6,jboss7.0.2,s ... -
解决cxf的jar包冲突
2012-03-28 20:23 15882本次做web service开发,遇到了一些问题,最终解决了, ... -
用soapUI调试web service
2012-03-27 21:00 2988用soapUI调试web service是很方便的,可以省掉自 ... -
对web service和cxf的个人理解
2012-02-29 23:59 1813个人理解很粗浅,只是谈谈感受,希望能抛砖引玉。就从本次项目的实 ... -
用cxf发布和调用web service
2012-02-29 23:03 17987最近我们的系统需要和一个第三方系统对接,对接的方式是通过web ... -
cxf和spring mvc的集成
2012-02-29 22:27 17749Spring MVC是通过DispatcherServlet来 ... -
我个人理解的什么是web service
2012-01-05 20:26 1788有一些乱七八糟的想法,还不成章法,先记录下来,以后再回头看看 ... -
关于B/S和C/S的想法,兼谈web service
2011-08-24 20:31 3138最近做的这个项目,是 ...
相关推荐
Ⅰ)开发web service业务接口,该接口用@WebService修饰; Ⅱ)开发web service业务接口的实现类,也要用@WebService修饰; Ⅲ)使用EndPoint类的静态方法publish()来发布web service。 2、客户端 Ⅰ)调用CXF...
apache-cxf-2.4.0(Web Service代码生成).zip,有说明
SpringBoot+mybatis+CXF开发web service接口,数据库用的是mysql,表结构在图片中,附上的还有自动生成的客户端代码
Springboot整合CXF发布Web service和客户端调用(用户和密码验证)打开及用
详细介绍3种方法根据wsdl逆向生成webservice服务端;有最原始的wsdl2java指令,还有通过soapUI工具以及通过myeclipse的web service project来生成。
apache cxf 3.1.8 java web service 开源框架
CXF 生成Web Service Client(将WSDl 转化成 Java代码)
Eclipse根据wsdl文件自动生成webservice client图解,以及调用示例,附测试项目。源码示例,包括两个wsdl文件
11)、Web Service使用CXF。 12)、SQL监控使用P6SPY。 13)、JS和CSS压缩使用YUI Compressor。 14)、JAVA代码混淆使用Allatori。 15)、获取系统信息使用Sigar。 16)、单元测试使用JUnit。 17)、配置文件加密使用...
自定义SOAP服务URL和CXF生成的Service站点的标题 配置CXF以使用slf4j并提供Logging-Interceptors,以仅将SOAP-Messages登录到控制台 提取SoapMessages以在Elastic-Stack(ELK)中进行处理,例如 定制您自己的...
1.采用cxf集成Spring实现webservice接口的发布。...2.(调用一)用eclipse根据wsdl连接自动生成java代码实现接口的调用。 3.(调用二)用axis2实现接口调用。 4.开发环境:eclipse+jdk1.8+tomcat8.5
对方的webservice服务端使用axis1.4开发,参数有String[]类型,试了cxf、xfire等都无法生成客户端,只能使用axis4. 解压后lib包已经全了。修改xx.bat里webservice地址一项,执行xx.bat生成客户端文件。 生成之后,...
使用JAX-WS RI和JAXB的Apache CXF和SpringBoot的SOAP-Webservices-仅注释,绝对没有XML 作为Example SOAP-Service,我做了一些研究,但是毕竟(或因为?)几乎所有教程都使用了众所周知的 ,它是最好的用例。 在...
Web Service(cxf+Spring) 小例子,实现了自动生成wsdl文件
它是一种思想,IBM大力倡导是即插即用的,IBM大力提倡,希望以组装电脑的方式来开发应用 它是目录服务,通过该服务可以注册和发布webservcie,以便第三方的调用者统一调用 使用: 二、我们可以...
JAVA如何调用wsdl过程详解java WSDL接口webService实现方式PHP调用wsdl文件类型的接口代码分享解析利用wsdl.exe生成webservice代理类的详解在PHP中利用wsdl创建标准webservice的实现代码Java调用CXF WebService接口...
项目Maven构建,真实大型互联网架构,做到高并发,大数据处理,整个项目使用定制化服务思想,提供模块化、服务化、原子化的方案,将功能模块进行拆分,可以公用到所有的项目中。架构采用分布式部署架构,所有模块...