`

根据已有的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",

删掉它是觉得代码都生成了,这个wsdl文件应该没啥用了

结果启动还是报刚才的错误:

Schema name conflict in collection. Namespace:xxxxxx

最后又把
wsdlLocation = "file:saService.wsdl",

加回去了,只是改成
wsdlLocation = "file:/opt/xxx/saService.wsdl",

然后把这个文件放到服务器上,这次终于成功了

发布成功了,但是实际用soapUI调了一下,代码又出异常了,根据日志定位了一下,发现是一个Spring里声明的bean找不到:

2012-04-11 21:28:06,859 ERROR [STDERR] org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'AcceptMsgImpl' is defined

我TMD就纳闷了,这怎么能找不到呢,代码里是有的:
@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" />

而且这段代码其实已经用过很长时间了,测试都测了几轮,完全没有问题。今天只是把web service接口相关的东西换了换,这里居然就bean出异常了,实在理解不了

联想到之前有一次,也是集成cxf和spring,结果@Autowired有异常,说找不到<jaxws:client>声明的bean,我就想是不是spring和cxf有点啥东西我不清楚,造成注解不好使呢

为了先解决问题,把这里改了,不用注解了,用普通的配置文件
public class AcceptMsgImpl implements AcceptMsgService {

	private WoCmDao woDao;

public void setWoDao(WoCmDao woDao) {
		this.woDao = woDao;
	}

<bean id="AcceptMsgImpl" class="com.huawei.wfm.czekh.service.impl.AcceptMsgImpl">
		<property name="transitionDao" ref="tblWfconfTransitionHibernate" />
		<property name="woDao" ref="woCmHibernateDao" />
	</bean>

这样一弄就行了,bean找到了。可是在我心里就留下一个很大的问题,为什么注解就不行了呢?

同样用注解方式配置bean和依赖关系,这部分代码完全没有变化。只是之前相关的web service的接口、实现类、Model,换了另外一套web service的接口、实现类、Model。其他的完全没有变化,可是就是不行了,搞不懂

不管怎么样,问题还算是解决了,总结一下:

1、如果wsdl文件有点问题,还是尽量不要用wsdl2java -p参数会好一点
2、web service实现类里的@WebService注解里的wsdlLocation属性还是不能乱删
3、我感觉spring和cxf集成的时候,spring的注解不太正常,时灵时不灵,保险起见,不要用就不会有问题了


遗留了一个问题,希望以后有机会能搞清楚是为什么:

Spring和CXF集成的时候,有时候Spring的注解会不好用,这到底是为啥
分享到:
评论

相关推荐

    根据wsdl生成webservice服务端(3种方式)

    在日常开发中,通常是由开发团队构建WebService服务端,客户端则通过服务端提供的WS-Definition Language (WSDL) 文件生成客户端代理并进行交互。但有时也会遇到特殊情况,比如与特定企业合作时,对方可能仅提供WSDL...

    使用Eclipse的Axis1.4插件开发Web Service及客户端

    1. **创建Web Service服务端** - 首先,创建一个新的Java项目,例如`AxisServerDemo`。 - 编写一个简单的Java类,如`User`,包含需要公开的服务方法,如`sayHello`方法。 - 使用Eclipse的Axis向导将这个类转换为...

    XFire创建WebService服务端和客户端

    1. **生成客户端代理**:XFire提供了一个工具(如`xfire-proxy-gen`)用于从服务端的WSDL(Web Service Definition Language)文件生成客户端代理类。运行这个工具,指定服务的WSDL URL,它会生成相应的Java客户端...

    web service客户端

    在开发Web Service客户端之前,首先需要确保已安装并配置了Apache Axis2。这通常包括下载Axis2的发行版,将其解压到合适的位置,并将相关的JAR包添加到项目的类路径中。在示例代码中,可以看到所需的Jar包,这些包...

    delphi 6/Kylik2 soap/Web Service程序设计篇下册+代码,非常好的教程。

    Delphi 6中的Soap Toolkit可以自动生成WSDL文件,也可以根据已有的WSDL文件创建服务端代码。 3. **XML数据绑定**: SOAP消息是基于XML的,Delphi 6提供了TXMLDataModule和TXMLDocument组件来处理XML数据。...

    使用Eclipse + MyEclipse开发Web Service的示例

    1. **创建Web服务客户端**:在MyEclipse中,可以使用"New" -&gt; "Web Service Client"来导入WSDL,自动生成客户端代理类和相关配置。 2. **编写调用代码**:在客户端项目中,通过代理类实例化Web服务,并调用其提供的...

    《C++ Builder 6 SOAP Web Service》配套光盘

    4. WSDL生成器和解析器:可能提供了一些工具,帮助开发者自动生成WSDL文件,或者解析已有的WSDL来生成客户端代码。 5. 资料库:可能包含了关于SOAP和Web服务标准的参考文档,如SOAP规范、WSDL规范以及XML Schema等。...

    Axis开发Web Service实例

    【Axis开发Web Service实例】 Apache Axis 是一个开源的Web Service框架,它允许开发者轻松地创建和部署Web服务。本文将详细介绍使用Axis开发Web服务的全过程,包括安装、编写服务、发布服务以及客户端调用。 **一...

    xfire开发Web Service接口第一个程序源代码

    Xfire作为一个框架,它提供了对这些标准的支持,使得开发者无需深入理解底层细节,就能快速地创建服务端和客户端的应用。 在使用Xfire开发Web服务时,我们通常会遵循以下步骤: 1. **设置环境**:首先,你需要在...

    实战Web Service —— 使用Apache CXF开发Web服务的教程

    - **Java First方法**:通过Java类直接生成WSDL,适用于已有业务逻辑的情况。 - **WSDL First方法**:根据WSDL定义生成Java代码,适用于已知服务接口的情况。 4. **创建服务端**: - 定义服务接口和实现类,...

    wsdl2java工具

    `wsdl2java`是Apache CXF框架提供的一款命令行工具,它能够根据WSDL文件自动生成Java客户端和服务端代码,大大简化了Web服务的开发流程。这个工具支持两种方式来获取WSDL:文件路径和URL。 ### 使用WSDL2Java工具 ...

    web项目添加webservice 服务端(axis)

    这里我们主要讨论如何在已有的Web项目中集成Apache Axis,它是Java平台上广泛使用的Web服务框架,用于生成、部署和调用Web服务。 **1. Web服务简介** Web服务是一种基于网络的、平台和语言无关的接口,通过SOAP...

    javax.wsdl_1.6.2.v201012040545.jar

    【标签】"javaws.wsdl" 指明这个库主要关注于Java与WSDL的交互,尤其是客户端和服务端的Java应用在构建和使用Web服务时所需的功能。 【详细说明】 1. **WSDL基本概念**:WSDL全称Web Services Description Language...

    第15章 开发XFire Web Service应用.pdf

    - **代码生成**:支持从WSDL文件生成客户端和服务端代码。 - **调试支持**:提供断点调试、日志记录等功能,便于调试Web服务。 - **部署选项**:支持将Web服务部署到多种应用服务器上,如Tomcat、JBoss等。 #### ...

    调用BIEE提供的web service

    根据项目需求和开发环境选择合适的工具。 3. **创建客户端代理**:在选定的编程语言中,使用WSDL文件生成客户端代理类或库,这将帮助我们方便地调用BIEE的Web服务方法。 4. **身份验证**:BIEE Web服务通常需要...

    Web Service Tutorial JAVA

    它包括一个聊天服务器和两个客户端:一个 Java 客户端和一个 .NET 客户端。聊天服务器提供核心的服务逻辑,如用户注册、消息发送和接收等功能。 ##### 3.3 从应用到 Web 服务 **概述**:首先,我们需要了解如何将...

    如何通过Web-Service-实现断点续传或下载文件.doc

    总结来说,通过Web Service实现断点续传或下载文件,需要对Web Service的原理和协议有深入理解,同时在客户端和服务器端都需要进行定制化的开发,以支持状态的保存和恢复,以及数据的分块处理。这涉及到对XML、HTTP...

Global site tag (gtag.js) - Google Analytics