`

调用WSDL文件的两种方法(非动态和动态)

 
阅读更多
<jaxws:endpoint
	  id="xxWebService"
	  implementor="#firstCxfService"
	  address="/xxWebService" /> 


别忘了address中的 / 非常重要

package com.controller;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

import com.webservice.FirstCxfService;
import com.webservice.bo.TestBo;

/**
 * @author:
 * @TODO:动态wsdl文件
 */
public class CxfClient {
	private static final String WSDL_URL = "http://localhost:8080/RestFulServer/services/xxWebService?wsdl";
	
	public static void main(String[] args) {
		// 第一种方式需要客户端生成wsdl对应的java文件 (非动态)
		JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
		// 获取服务器端
		factoryBean.setAddress(WSDL_URL);
		// 通过客户端的接口获取服务器端的接口
		factoryBean.setServiceClass(FirstCxfService.class);
		FirstCxfService hello = (FirstCxfService) factoryBean.create();
		System.out.println(hello.sayHello(2));
		TestBo testBo = hello.getTestBo("lau");
		System.out.println(testBo.getName());

		// 第二种方式  不需要wsdl文件生成java文件 (动态)
		try {
			JaxWsDynamicClientFactory dynamicClientFactory = JaxWsDynamicClientFactory
					.newInstance();
			Client client = dynamicClientFactory
					.createClient(WSDL_URL);
			//  第一个参数是方法名        第二个参数是方法对应的参数值
			Object[] objects = client.invoke("sayHello", 2);
			System.out.println(objects[0].toString());
			objects = client.invoke("getTestBo", "lau");
			//得到对象所封装的值
			System.out.println(objects[0].getClass().getMethod("getName").invoke(objects[0]));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}



如果动态调用出差则可能由下面的原因导致
1.注意:如果使用动态调用wsdl文件则应该在定义webService时指定命名空间
命名空间的值与wsdl文件中的命名空间想对应

2.产生的原因是没有获得编译环境,也就是JRE设置的问题,需要在eclipse里面把jre设置为jdk下的jre。
package com.webservice.impl;

import javax.annotation.Resource;
import javax.jws.WebService;

import com.dwr.Test;
import com.dwr.TestDAO;
import com.webservice.FirstCxfService;
import com.webservice.bo.TestBo;
//指定命名空间targetNamespace
@WebService(targetNamespace = "http://webservice.com/", 
			endpointInterface = "com.webservice.FirstCxfService")
public class FirstCxfServiceImpl implements FirstCxfService {

	@Resource
	private TestDAO testDAO;

	@Override
	public int sayHello(int id) {
		Test test = new Test();
		test.setId(id);
		return this.testDAO.getCount(test);
	}

	@Override
	public TestBo getTestBo(String name) {
		TestBo testBo = new TestBo();
		testBo.setName(name);
		return testBo;
	}
}



WSDL文件中的wsdl:definitions标签下的targetNamespace属性值对应


<?xml version='1.0' encoding='UTF-8'?>
<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://webservice.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="FirstCxfServiceImplService" targetNamespace="http://webservice.com/">
  <wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://webservice.com/" elementFormDefault="unqualified" targetNamespace="http://webservice.com/" version="1.0">
<xs:element name="getTestBo" type="tns:getTestBo"/>
<xs:element name="getTestBoResponse" type="tns:getTestBoResponse"/>
<xs:element name="sayHello" type="tns:sayHello"/>
<xs:element name="sayHelloResponse" type="tns:sayHelloResponse"/>
<xs:complexType name="sayHello">
    <xs:sequence>
      <xs:element name="arg0" type="xs:int"/>
    </xs:sequence>
  </xs:complexType>
<xs:complexType name="sayHelloResponse">
    <xs:sequence>
      <xs:element name="return" type="xs:int"/>
    </xs:sequence>
  </xs:complexType>
<xs:complexType name="getTestBo">
    <xs:sequence>
      <xs:element minOccurs="0" name="arg0" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
<xs:complexType name="getTestBoResponse">
    <xs:sequence>
      <xs:element minOccurs="0" name="return" type="tns:testBo"/>
    </xs:sequence>
  </xs:complexType>
<xs:complexType name="testBo">
    <xs:sequence>
      <xs:element minOccurs="0" name="name" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
  </wsdl:types>
  <wsdl:message name="sayHelloResponse">
    <wsdl:part element="tns:sayHelloResponse" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="sayHello">
    <wsdl:part element="tns:sayHello" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="getTestBo">
    <wsdl:part element="tns:getTestBo" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="getTestBoResponse">
    <wsdl:part element="tns:getTestBoResponse" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="FirstCxfService">
    <wsdl:operation name="sayHello">
      <wsdl:input message="tns:sayHello" name="sayHello">
    </wsdl:input>
      <wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse">
    </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getTestBo">
      <wsdl:input message="tns:getTestBo" name="getTestBo">
    </wsdl:input>
      <wsdl:output message="tns:getTestBoResponse" name="getTestBoResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="FirstCxfServiceImplServiceSoapBinding" type="tns:FirstCxfService">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="getTestBo">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="getTestBo">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="getTestBoResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="sayHello">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="sayHello">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="sayHelloResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="FirstCxfServiceImplService">
    <wsdl:port binding="tns:FirstCxfServiceImplServiceSoapBinding" name="FirstCxfServiceImplPort">
      <soap:address location="http://localhost:8080/RestFulServer/services/xxWebService"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Java调用WSDL

    "Java 调用 WSDL" Java 调用 WSDL 是一种常见的技术,它允许 Java 应用程序调用远程... Java 调用 WSDL 文件是通过解析 WSDL 文件来获取服务的接口和操作信息,然后使用 AXIS 库或 SOAP 库等来调用远程的 Web 服务。

    基于 Apache Axis2 将上述类的方法对外提供 Web 服务,生成 WSDL 文件,以及调用服务

    在这个教程中,我们将学习如何使用Apache Axis2将一个简单的类转换为对外提供服务的Web服务,并生成WSDL文件,以及如何调用这些服务。 首先,我们需要了解提供的类`Person`,它包含`name`、`age`和`gender`三个属性...

    JAVA如何调用wsdl过程详解

    本文档详细介绍了如何使用Java调用wsdl文件,并通过两种主要方式:使用cxf的wsdl2java工具生成本地类和创建客户端远程调用接口进行操作。 首先,在进行任何操作之前,需要确保wsdl接口可用且能正常调用。接着,文档...

    WSDL文件简介-本文介绍了如何编写一个简单的WSDL文件,并根据WSDL文件编写服务器端和客户端代码,并发布Web Service服务的过程

    WSDL 文件分为两个主要版本:WSDL 1.1 和 WSDL 2.0。其中,WSDL 1.1 是由 W3C 组织于 2001 年发布的规范,而 WSDL 2.0 则在 2007 年被提出。这两个版本的规范文档分别可以在以下链接找到: - [Web Services ...

    wsdl文件祥解

    WSDL文件是一种XML文档,它主要由两大部分组成:抽象定义和具体定义。这两部分分别负责定义服务接口和具体的实现细节。 - **抽象定义**:这部分不依赖于任何特定的编程语言或操作系统,而是专注于描述服务的接口。...

    springboot-wsdl.java

    springboot调用webservice接口的两种方式,不使用axis

    wsdl文件原公司超详细

    开发过程中,常见的WSDL工具包括Apache Axis、IBM WebSphere Studio Application Developer、Microsoft .NET Framework的Wsdl.exe等,它们可以帮助开发者生成和处理WSDL文件。 总结来说,WSDL是Web服务的重要组成...

    Onvif的wsdl文件的编译

    gSOAP不仅能够解析和生成WSDL文件,还能自动生成客户端和服务端的C++代码,大大简化了与Web服务交互的复杂度。 在你的描述中提到,你已经从ONVIF官网获取了最新的WSDL文件,并下载了相应的XSD(XML Schema ...

    gsoap移植之wsdl文件

    它支持SOAP(简单对象访问协议)和WSDL(Web服务描述语言),这两种技术是实现跨平台网络通信的关键标准。本文将深入探讨如何在不同平台上进行gSOAP的移植工作,特别是涉及到与WSDL文件相关的操作,以及在IPCAM...

    C#.NET_动态调用webservice的三种方式

    除了上述两种方法外,我们还可以直接通过反射机制来调用WebService。这种方式更灵活但相对复杂,适用于对性能要求不高或不希望编译额外代码的情况。 **步骤1:**下载WSDL并解析。 此步骤与第一种方法相同。 **...

    onvif所有 wsdl文件

    WSDL文件是XML格式的文档,描述了服务提供的操作、消息交换模式以及如何通过网络调用这些服务。 标题提到的"onvif所有 wsdl文件",指的是ONVIF规范中的所有核心服务接口的WSDL文件集合。这些文件对于开发者来说是至...

    WSDL文件详解.doc

    ### WSDL文件详解 #### 使用WSDL的原因 WSDL(Web Services Description Language)是一种用于描述网络服务的标准格式,它能够帮助实现跨语言和跨平台的服务交互。随着互联网技术的发展,不同系统之间的通信变得...

    WSDL 文件及其属性

    `rpc`风格模拟远程方法调用,使得客户端和服务端之间的交互看起来像调用函数或方法;而`document`风格则侧重于传递XML文档,更符合数据交换的语义。use属性有`encoded`和`literal`两个值。`encoded`表示SOAP消息体中...

    06.WSDL深入详解和WebService调用过程的底层本质

    例如,一个WSDL文件可能定义了一个名为“Add”操作,接收两个数字并返回它们的和。 WSDL文档包含以下几个主要部分: 1. **服务定义**:指定服务的名称和端点(也称为SOAP地址或Endpoint),这是服务实际可供访问的...

    wsdl文件详解 web wervices

    **WSDL文件详解:Web Services基础** Web服务(Web Services)是一种通过互联网交换数据和执行功能的方式...通过阅读和学习`wsdl-xsd.doc`和`wsdl文件详解.doc`这两个文档,你将能深入理解WSDL的工作原理和实际应用。

    onvif各模块wsdl文件

    描述中提到的“wsdl2h”和“soapcpp2”是两个关键工具,它们在C++环境中处理WSDL文件以创建ONVIF服务和客户端的代码框架: 1. `wsdl2h`:这是一个由GSOAP库提供的命令行工具,它的主要作用是从WSDL文件中提取类型...

    简单WSDL实例

    WSDL文件是Web服务客户端和服务提供者之间进行交互的基础,确保双方能够正确理解和调用服务。 本实例将深入探讨一个简单的WSDL文件结构及其组成部分,帮助读者理解如何创建和解析WSDL文件,以便更好地利用Web服务。...

    wsdl.rar_WSDL

    WSDL有1.1和2.0两个主要版本。WSDL 1.1是最早的版本,被广泛使用;WSDL 2.0则引入了更复杂、更灵活的模型,但兼容性不如1.1版本。此外,还有许多针对特定需求的WSDL扩展,如WS-I(Web Services Interoperability)的...

    cxf服务端wsdl发布帮助

    CXF允许开发者通过两种主要方式实现Web服务:JAX-WS(Java API for XML Web Services)和JAX-RS(Java API for RESTful Web Services)。对于WSDL发布的讨论,我们将聚焦于JAX-WS,因为它与传统的SOAP服务紧密相关,...

Global site tag (gtag.js) - Google Analytics