根据已有的wsdl,开发web service的服务端和客户端
折腾了好长时间,今天终于把这次web service对接的需求完全开发完了,在此总结一下
spring的版本是3.0.6,cxf的版本是2.0.13,jboss版本是jboss4.2.3 GA,jdk6。此外客户端和服务端的wsdl文件,都是客户提供好现成的,我们只能照着开发
主要用wsdl2java命令,根据第1个wsdl开发比较顺利,见另外一篇博客http://kyfxbl.iteye.com/blog/1481330
可是根据第2个wsdl文件开发就悲剧了,用的命令也是wsdl2java -p packageName -d distLocation -all xxx.wsdl
结果报以下错误:
WSDLToJava Error: Thrown by JAXB : A class/interface with the same name "xxx.xxx.Message" is already in use. Use a class customization to resolve this conflict.
不知道是不是wsdl文件本身的问题,我们也没法改,于是就用了以下命令:
wsdl2java -p packageName -d distLocation -all -autoNameResolution xxx.wsdl
这次倒是生成了,可是发布起来的时候,又报了以下错误:
Schema name conflict in collection. Namespace:xxxxxx
卡了一天也没搞定,今天一个同事发现了一个办法,改用以下命令:
wsdl2java -d distLocation -all xxx.wsdl
这次没有用-p参数强制指定包名,结果cxf生成了很多个包,没有再报原先的错误:
WSDLToJava Error: Thrown by JAXB : A class/interface with the same name "xxx.xxx.Message" is already in use. Use a class customization to resolve this conflict.
然后把所有生成的代码拷贝到工程里面,删掉了_Client、_Server、Service结尾的3个多余文件
说句题外话,用wsdl2java命令生成的代码,里面冗余是比较多的,不过一般都分成以下几类,看多了就会分辨了:
第1类是request/response的model类,有时候会有嵌套,比如XXXRequest,XXXRequestBody之类的
第2类是_Client、_Server、_Service结尾的类,这些类基本都是可以放心删除的
第3类是web service接口类和实现类,接口类是必须的,实现类在客户端不需要,在服务端需要修改
第4类是package-info和ObjectFactory,需要保留,好像主要是跟packageName和targetNamespace有关,我也不太懂
然后在web service接口实现类中,删掉了
@WebService(serviceName = "inbound.webServices.ticket.saService", portName = "inbound.webServices.ticket.saServiceSoap12", targetNamespace = "urn:services-astea.huawei.cz:inbound.webServices.tickets/v1.0/saService", wsdlLocation = "file:saService.wsdl", endpointInterface = "cz.huawei.astea.services.inbound_webservices_tickets.v1_0.saservice.InboundWebServicesTicketSaServiceSoap")
wsdlLocation = "file:saService.wsdl",
wsdlLocation = "file:saService.wsdl",
wsdlLocation = "file:/opt/xxx/saService.wsdl",
@Service("AcceptMsgImpl")public class AcceptMsgImpl implements AcceptMsgService{ @Autowired private WoCmDao woDao;
<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:component-scan base-package="com.huawei.wfm.czekh" />
public class AcceptMsgImpl implements AcceptMsgService {private WoCmDao woDao;public void setWoDao(WoCmDao woDao) {this.woDao = woDao;}
<bean id="AcceptMsgImpl" ref="tblWfconfTransitionHibernate" /><property name="woDao" ref="woCmHibernateDao" /></bean>