`
xm_koma
  • 浏览: 384137 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

基于wsdl文件用xfire生成webservice客户端

阅读更多

这篇笔记,只是针对于基于wsdl文件生成客户端代码后,来编写访问webservice的客户端。作为开发过程中遇到的问题的记录。

开发环境:jdk1.5、xfire-1.2.6

由于服务端并非本公司开发,所以只能拿到服务端的wsdl文件,首先想到的是,基于wsdl文件生成客户端代码,然后在此基础上按照业务来编写请求类。

XFire 官方网站 http://xfire.codehaus.org
可以从该网站下载xfire-distribution-1.2.6.zip文件,里面包含了xFire的文档、类包及相关文档说明。

jar包都在lib下,另外不要忘记了xfire-all-1.2.6.jar包。
一、new一个project:MyWebservice

然后右键再new一下,选择other:



 next,出现下图:

 

上图中的WSDL URL or path栏可以选择url地址:http://<ip>:<port>/path/XXX?wsdl,也可以将wsdl文件下载到本地,选择本地wsdl文件。由于本项目用到的url本地无法访问,因此必须在服务器上下载服务端的wsdl文件到本地,利用本地的wsdl文件生成客户端。

Output directory一栏,是选择你生成的代码放入的目录。由于之前新建了一个MyWebservice的工程,所以这里选择该工程的src目录,当然也可以新建你指定的目录列表(下面的package一栏可以选择指定的目录,这里暂时选择default)。如下图:



 

点击finish完成,生成如下图目录结构的客户端代码(MyClient类是后面自己编写的访问请求类)。



 

二、编写客户端调用类:MyClient

package com.telement.intf.huaxia.service.impl;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;

import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

public class MyClient {

	public static void main(String[] args) {
		MyClient mc = new MyClient();
		mc.queryWebSiteByXfireThree();
	}

	public void queryWebSiteByXfireOne() {
		Service srvcModel = new ObjectServiceFactory()
				.create(HuaXiaServiceImplPortType.class);
		XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
				.newInstance().getXFire());

		String helloWorldURL = "http://<ip>:<port>/path/serviceName";
		String requestXmlStr = "yours_request_str";
		try {
			HuaXiaServiceImplPortType srvc = (HuaXiaServiceImplPortType) factory
					.create(srvcModel, helloWorldURL);
			JAXBElement<String> requestParm = new JAXBElement<String>(
					new QName("http://impl.service.huaxia.intf.telement.com/",
							"HuaXiaServiceImplPort"), String.class,
					requestXmlStr);
			JAXBElement<String> resultStr = srvc.queryWebSite(requestParm);
			System.out.println(resultStr.getValue());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}

	}

	public void queryWebSiteByXfireTwo() {
		String requestXmlStr = "yours_request_str";
		URL url = null;
		Client client = null;
		try {
			url = new URL("http://<ip>:<port>/path/serviceName?wsdl");
			client = new Client(url);
			System.out.println(requestXmlStr);
			String result = (String) client.invoke("queryWebSite",
					new Object[] { requestXmlStr })[0];
			System.out.println(result);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void queryWebSiteByXfireThree() {
		String requestXmlStr = "yours_request_str";
		HuaXiaServiceImplClient hxc = new HuaXiaServiceImplClient();
		HuaXiaServiceImplPortType service = hxc.getHuaXiaServiceImplPort();
		JAXBElement<String> requestParm = new JAXBElement<String>(new QName(
				"http://impl.service.huaxia.intf.telement.com/",
				"HuaXiaServiceImplPort"), String.class, requestXmlStr);
		JAXBElement<String> resultStr = service.queryWebSite(requestParm);
		System.out.println(resultStr.getValue());
	}
}

 

 调用上述类中方法一和方法三测试后发现如下异常:(方法二正常,因为方法二与生成的客户端存根代码无关)

Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Couldn't get property {http://lang.java}classes from bean class java.lang.String. Nested exception is java.lang.reflect.InvocationTargetException: null
org.codehaus.xfire.fault.XFireFault: Couldn't get property {http://lang.java}classes from bean class java.lang.String. Nested exception is java.lang.reflect.InvocationTargetException: null
	at org.codehaus.xfire.fault.XFireFault.createFault(XFireFault.java:89)
	at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:83)
	at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
	at org.codehaus.xfire.client.Client.invoke(Client.java:336)
	at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)
	at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
	at $Proxy6.queryWebSite(Unknown Source)
	at com.telement.intf.huaxia.service.impl.MyClient.queryWebSiteByXfireOne(MyClient.java:77)
	at com.telement.intf.huaxia.service.impl.MyClient.main(MyClient.java:27)
Caused by: org.codehaus.xfire.XFireRuntimeException: Couldn't get property {http://lang.java}classes from bean class java.lang.String. Nested exception is java.lang.reflect.InvocationTargetException: null
	at org.codehaus.xfire.aegis.type.basic.BeanType.readProperty(BeanType.java:446)
	at org.codehaus.xfire.aegis.type.basic.BeanType.writeObject(BeanType.java:377)
	at org.codehaus.xfire.aegis.type.basic.BeanType.writeObject(BeanType.java:392)
	at org.codehaus.xfire.aegis.type.basic.ArrayType.writeValue(ArrayType.java:298)
	at org.codehaus.xfire.aegis.type.basic.ArrayType.writeObject(ArrayType.java:210)
	at org.codehaus.xfire.aegis.type.basic.BeanType.writeObject(BeanType.java:392)
	at org.codehaus.xfire.aegis.type.basic.BeanType.writeObject(BeanType.java:392)
	at org.codehaus.xfire.aegis.type.basic.ArrayType.writeValue(ArrayType.java:298)
	at org.codehaus.xfire.aegis.type.basic.ArrayType.writeObject(ArrayType.java:210)
	at org.codehaus.xfire.aegis.type.basic.BeanType.writeObject(BeanType.java:392)
	at org.codehaus.xfire.aegis.type.basic.BeanType.writeObject(BeanType.java:392)
	at org.codehaus.xfire.aegis.type.basic.ArrayType.writeValue(ArrayType.java:298)
	at org.codehaus.xfire.aegis.type.basic.ArrayType.writeObject(ArrayType.java:210)
	at org.codehaus.xfire.aegis.type.basic.BeanType.writeObject(BeanType.java:392)
	at org.codehaus.xfire.aegis.type.basic.BeanType.writeObject(BeanType.java:392)
	at org.codehaus.xfire.aegis.type.basic.ArrayType.writeValue(ArrayType.java:298)

 

思路一直停留在org.codehaus.xfire.XFireRuntimeException: Could not invoke service上面,但后面发现修改

wsdl文件中的一个属性nillable,可以解决下面的这个Exception:

Couldn't get property {http://lang.java}classes from bean class java.lang.String. Nested exception is java.lang.reflect.InvocationTargetException: null

  

从服务端下载到的wsdl文件中,<xsd:element>元素存在这么几个元素:

<xsd:element minOccurs="0" name="requestXml" nillable="true" type="xsd:string"></xsd:element>

造成在生成客户端代码的时候将本来是String类型的请求参数和返回值都封装成了JAXBElement<String>这个类,因此在编写MyClient这个类的时候,自然就想到要将请求参数封装为JAXBElement<String>。

 

经过调试发现改为:

<xsd:element minOccurs="0" name="requestXml" nillable="false" type="xsd:string"></xsd:element>

或者

<xsd:element maxOccurs="1" minOccurs="1" name="requestXml" nillable="true" type="xsd:string"></xsd:element>

 

再根据wsdl文件来生成客户端,便是本真的String类型作为参数和返回的数据类型。  

 

三、修改编写好的客户端调用类:MyClient

package com.telement.intf.huaxia.service.impl;

import java.net.MalformedURLException;
import java.net.URL;

import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

public class MyClient {

	public static void main(String[] args) {
		MyClient mc = new MyClient();
		mc.queryWebSiteByXfireOne();
	}

	public void queryWebSiteByXfireOne() {
		Service srvcModel = new ObjectServiceFactory()
				.create(HuaXiaServiceImplPortType.class);
		XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
				.newInstance().getXFire());

		String helloWorldURL = "http://<ip>:<port>/path/serviceName";
		String requestXmlStr = "yours_request_str";
		try {
			HuaXiaServiceImplPortType srvc = (HuaXiaServiceImplPortType) factory
					.create(srvcModel, helloWorldURL);
			String resultStr = srvc.queryWebSite(requestXmlStr);
			System.out.println(resultStr);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}

	}

	public void queryWebSiteByXfireTwo() {
		String requestXmlStr = "yours_request_str";
		URL url = null;
		Client client = null;
		try {
			url = new URL("http://<ip>:<port>/path/serviceName?wsdl");
			client = new Client(url);
			System.out.println(requestXmlStr);
			String result = (String) client.invoke("queryWebSite",
					new Object[] { requestXmlStr })[0];
			System.out.println(result);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void queryWebSiteByXfireThree() {
		String requestXmlStr = "yours_request_str";
		HuaXiaServiceImplClient hxc = new HuaXiaServiceImplClient();
		HuaXiaServiceImplPortType service = hxc.getHuaXiaServiceImplPort();
		String resultStr = service.queryWebSite(requestXmlStr);
		System.out.println(resultStr);
	}
}

 

方法一的方式调用依然存在Exception:

Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Fault occurred while proce
ssing.
org.codehaus.xfire.fault.XFireFault: Fault occurred while processing.
        at org.codehaus.xfire.fault.Soap11FaultSerializer.readMessage(Soap11FaultSerializer.java:31)
        at org.codehaus.xfire.fault.SoapFaultSerializer.readMessage(SoapFaultSerializer.java:28)
        at org.codehaus.xfire.soap.handler.ReadHeadersHandler.checkForFault(ReadHeadersHandler.java:111)
        at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:67)
        at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
        at org.codehaus.xfire.client.Client.onReceive(Client.java:406)
        at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)
        at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
        at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
        at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
        at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)
        at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
        at org.codehaus.xfire.client.Client.invoke(Client.java:336)
        at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)
        at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
        at $Proxy6.queryWebSite(Unknown Source)
        at com.telement.intf.huaxia.service.impl.MyClient.queryWebSiteByXfireOne(MyClient.java:31)
        at com.telement.intf.huaxia.service.impl.MyClient.main(MyClient.java:16)

 

但方法二和方法三调用可正常返回结果。

 

 由于在网上搜索到很多文章都是提到xfire客户端调用方式是上述MyClient类中的方法一,所以笔者写了一个简单的服务端,然后另外起一个project来生成客户端并测试,发现确实是行得通的。所以暂时将该问题记录下来,如果有知道原因的童鞋,也请指点下。

  • 大小: 3.3 KB
  • 大小: 2.2 KB
  • 大小: 20.3 KB
  • 大小: 11.1 KB
  • 大小: 22.4 KB
分享到:
评论

相关推荐

    Java使用XFire调用WebService接口

    在使用XFire时,通常需要WSDL文件来生成客户端代理类,这些类提供了调用Web服务的方法。 3. **XFire客户端API**:XFire提供了客户端API,可以自动生成客户端代码,这些代码包含了调用Web服务的必要方法。开发者只...

    xfire访问webservice客户端用到的jar包

    - **解析WSDL**:使用XFire提供的工具,如`wsdl2java`,从WSDL文件生成Java客户端 stubs。 - **初始化客户端**:实例化客户端代理,通常是一个实现了服务接口的类。 - **配置传输机制**:设置HTTP或HTTPS等传输...

    Xfire客户端调用webservice jar包

    这些库提供了客户端代理类生成工具,可以从WSDL(Web Service Description Language)文件自动生成对应的服务接口,使得开发者可以直接调用Java方法来发起Web服务请求。 在描述中提到的"亲测可用",意味着这个jar包...

    webservice xfire 客户端调用实现

    2. 生成客户端代码:使用XFire的wsdl2java工具生成客户端代理类。 3. 创建客户端实例:在Java代码中创建代理类的实例,通常需要指定服务的地址。 4. 调用服务方法:通过代理类的方法调用远程服务,传递必要的参数。 ...

    xfire生成webservice

    4. **生成Web服务描述语言(WSDL)**:使用XFire工具,通过服务接口自动生成WSDL文件。这通常可以通过右键点击项目,选择“XFire” &gt; “Generate WSDL from Service”来完成。 5. **配置部署文件**:创建一个名为`...

    xfire客户端生成

    2. **使用XFire工具**:XFire提供了命令行工具或者API来解析WSDL文件并生成对应的Java客户端代码。这些代码包含了必要的类和接口,使得开发者可以直接调用Web服务的方法。 3. **生成Java代码**:运行XFire的wsdl2...

    使用xfire开发webservice的客户端需要的完整jar包

    总结来说,使用Xfire开发Web服务客户端涉及导入必要的jar包、配置服务信息、生成代理类以及编写调用代码。虽然Xfire已不再更新,但其简单易用的特点使其在某些场景下依然具有价值。对于新项目,推荐使用更现代的框架...

    XFire Webservice 客户端

    WebService是一种基于开放标准(如SOAP、WSDL和UDDI)的,能够跨平台、跨语言的网络服务。它通过HTTP协议传递XML格式的数据,使得不同的系统间可以共享服务和数据。 ### 2. XFire Webservice API XFire Webservice ...

    Xfire调用webservice无法传递参数问题

    标题“Xfire调用WebService无法传递参数问题”暗示了开发者在尝试使用Xfire框架时遇到了参数无法正常传递到Web服务的情况。这可能涉及到多个方面,如编码问题、序列化错误、类型不匹配或者配置不正确等。以下是一些...

    使用DOS 生成webservice 客户端代码 (CXF)

    本文将专注于使用DOS命令行生成Web服务客户端代码,特别是基于Apache CXF框架的方法。Apache CXF是一个开源的Java框架,它支持多种Web服务标准,如SOAP、RESTful等,并且提供了方便的工具来生成客户端和服务端的代码...

    Webservice使用xfire发布及客户端调用

    - XFire提供了一个`ClientProxyFactoryBean`,用于根据WSDL生成一个Java客户端代理类。这个代理类可以像调用本地方法一样调用Web服务。 - 创建客户端代理后,实例化这个类并设置必要的连接参数(如服务URL),然后...

    xfire实现webservice实例

    6. **消费Web服务**:使用XFire的客户端API或者其他的SOAP客户端工具,可以轻松地调用发布的Web服务。 四、XFire的注解支持 XFire引入了注解,使得服务的创建更加简洁。例如,使用`@WebService`注解可以在不编写XML...

    基于 xfire 的 webservice 项目

    总的来说,这个基于XFire的WebService项目是一个很好的学习资源,它涵盖了Web服务的基本概念、XFire的使用方法,以及如何构建和测试Web服务。对于想要深入理解Java Web服务开发的初学者或者开发者来说,这是一个值得...

    使用XFire发布WebService

    1. **生成客户端代理**: 使用XFire的工具,如`xfire-codegen`,根据服务的WSDL生成客户端代理类。 2. **实例化代理**: 创建服务代理类的实例,并通过这个实例调用远程Web服务。 ```java CalculatorService ...

    xfire webservice 完整实例下载

    开发者可以使用WSDL文件生成客户端代码或者验证服务端实现。 3. **配置文件**:如`xfire-config.xml`,用于配置XFire的行为,例如指定服务绑定地址、注册服务等。 4. **构建脚本**:可能是Ant或Maven的build.xml...

    Xfire 开发webservice与客户端调用教程与实例

    然后,实现这个接口并部署到服务器,Xfire会自动生成相应的WSDL文件,供客户端调用。 **3. 部署Web服务** Xfire允许你将Web服务部署到任何Servlet容器,如Tomcat。只需要将Xfire的库添加到项目的类路径中,然后在...

    XFire与Spring集成WebService客户端的两种开发方式.pdf

    以下是如何使用Spring和XFire来创建基于WSDL的WebService客户端的步骤: 1. 引入必要的库,包括`org.codehaus.xfire.client.Client`和`org.springframework.core.io.ClassPathResource`。 2. 使用`ClassPath...

    xfire发布webservice实例

    用java通过xfire框架实现ws,实现正向生成wsdl文件,并由wsdl逆向生成java ws客户端代码 测试输入:http://localhost:8080/webservice-xfire/services/CalculatorService?wsdl

    xfire webservice wsdl 文件中字段名称

    标题“xfire webservice wsdl 文件中字段名称”和描述“xfire webservice wsdl 文件中字段名称变化”暗示了我们在讨论如何在XFire中处理和管理WSDL文件中的字段命名,特别是当这些名称需要更改时的处理方法。...

    用XFire开发WebService+Spring注解

    【描述】"用XFire开发WebService"意味着我们需要了解Web服务的基本概念,如WSDL(Web Service Description Language)和SOAP(Simple Object Access Protocol)。XFire提供了一个轻量级、高效的环境来构建这些服务,...

Global site tag (gtag.js) - Google Analytics