`
coolyzg
  • 浏览: 45585 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

如何提供java的基于document/literal的webservice接口

阅读更多
以前曾经调用过.NET发布的webservice接口,document/literal格式的,传入的参数是xml文档内容组合成的字符串,当时对这种方式还不是很了解。
服务提供方先给了一个xsd文档,然后给了wsdl文档,接下来在网上好不容易实现方法来调用。

可是现在我要提供java的基于document/literal的webservice接口,要传入的参数也是xml文档内容组合成的字符串(而且是多条记录,可能将上千条记录一起传过来,避免多次调用接口影响性能和响应时间),所以就开始研究document/literal格式,不过没多少头绪,也有一些疑惑,希望能得到大家的帮助。

1.首先,我要根据传入的参数的类型定义xsd文档?
2.如果这样的话,我是不是要将接受的字符串先转化成xml文档并根据xsd来验证参数的合法性?请问如何实现?(最好给些code^_^)

接下来就好办了,就卡在这地方了。
也许问题很浅显,那就请顺便指点一下,否则我走不下去了 呵呵
难者不会,会者不难

ps:调用类似的接口方法也很难找,下面我将调用代码贴出来和大家共享
分享到:
评论
3 楼 wy19860513 2008-10-24  
我有问题请教。。。怎么动态来获得wsdl 的值?
2 楼 coolyzg 2007-11-08  
晕哦,没人睬呀
1 楼 coolyzg 2007-11-07  
wsdl:
<definitions
     name="HelloWorld"
     targetNamespace="http://xmlns.oracle.com/HelloWorld"
     xmlns="http://schemas.xmlsoap.org/wsdl/"
     xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
     xmlns:client="http://xmlns.oracle.com/HelloWorld"
    >
    <types>
        <schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/HelloWorld"
             xmlns="http://www.w3.org/2001/XMLSchema">
            <element name="HelloWorldProcessRequest">
                <complexType>
                    <sequence>
                        <element name="input" type="string"/>
                    </sequence>
                </complexType>
            </element>
            <element name="HelloWorldProcessResponse">
                <complexType>
                    <sequence>
                        <element name="result" type="string"/>
                    </sequence>
                </complexType>
            </element>
        </schema>
    </types>
    <message name="HelloWorldRequestMessage">
        <part name="payload" element="client:HelloWorldProcessRequest"/>
    </message>
    <message name="HelloWorldResponseMessage">
        <part name="payload" element="client:HelloWorldProcessResponse"/>
    </message>
    <portType name="HelloWorld">
        <operation name="process">
            <input message="client:HelloWorldRequestMessage"/>
            <output message="client:HelloWorldResponseMessage"/>
        </operation>
    </portType>
    <binding name="HelloWorldBinding" type="client:HelloWorld">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="process">
            <soap:operation style="document" soapAction="process"/>
            <input>
                <soap:body use="literal"/>
            </input>
            <output>
                <soap:body use="literal"/>
            </output>
        </operation>
    </binding>
    <service name="HelloWorld">
        <port name="HelloWorldPort" binding="client:HelloWorldBinding">
            <soap:address location="http://robin:9700/orabpel/default/HelloWorld/1.0"/>
        </port>
    </service>
  <plnk:partnerLinkType name="HelloWorld">
    <plnk:role name="HelloWorldProvider">
      <plnk:portType name="client:HelloWorld"/>
    </plnk:role>
  </plnk:partnerLinkType>

</definitions>


2. 编写调用类,代码如下:
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import java.util.Vector;

import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;
import org.apache.axis.constants.Style;
import org.apache.axis.message.SOAPBodyElement;
import org.apache.xml.serialize.DOMSerializerImpl;
import org.apache.xml.serialize.OutputFormat;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class BPELServiceTest {
      //service的命名空间
	static final String ns = "http://xmlns.oracle.com/HelloWorld";

	public static void main(String args[]){
		Call call = null;
		try {
			call = createCall();
			Vector rtn = (Vector) call.invoke(createRequest());
			parse(rtn);
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FactoryConfigurationError e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

      /*       * 创建Call对象,对设置相关属性,注意:其中的属性应该是通过分析WSDL文件由程序动态获得来赋值,       * 这里全部简化为静态赋值       */
	static Call createCall() throws MalformedURLException, ServiceException{
		org.apache.axis.client.Service s = new org.apache.axis.client.Service();
		Call call = (Call) s.createCall();
		call.setTargetEndpointAddress(new URL("http://robin:9700/orabpel/default/HelloWorld/1.0"));
		call.setSOAPActionURI("process");
		call.setOperationName("process");
		call.setProperty(Call.OPERATION_STYLE_PROPERTY, Style.DOCUMENT.getName());
		call.setPortName(new QName(ns, "HelloWorldPort"));
		call.setPortTypeName(new QName(ns, "HelloWorld"));

		return call;
	}

      /*       *创建请求参数,实际上就是构建DOM片断,根据Web service对输入参数的要求来构建,要多复杂,都可以实现,       *这就是Docuemnt的好处,省去了复杂对象的序列化。       */
	static Object[] createRequest() throws ParserConfigurationException, FactoryConfigurationError{
		DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		Document doc = db.newDocument();
		Element root = doc.createElementNS(ns, "HelloWorldProcessRequest");
		Element input = doc.createElementNS(ns, "input");
		input.appendChild(doc.createTextNode("robin"));
		root.appendChild(input);
		doc.appendChild(root);

		return new Object[]{new SOAPBodyElement(root)};
	}

      // 对返回结果进行解析,并打印。
	static void parse(Vector v) throws Exception{
		Document doc = ((SOAPBodyElement) v.get(0)).getAsDocument();
		Element root = doc.getDocumentElement();
		OutputFormat of = new OutputFormat();
		of.setIndent(4);
		System.out.println(new DOMSerializerImpl().writeToString(root));
	}
}




上述代码运行输出结果为:

<?xml version="1.0"?>
<HelloWorldProcessResponse xmlns="http://xmlns.oracle.com/HelloWorld">
   <result xmlns="http://xmlns.oracle.com/HelloWorld">robin</result>
  </HelloWorldProcessResponse>



上面的代码很简单,需要说明的是:采用Document调用,实际上invoke方法的参数是一个元素类型为SOAPBodyElement的对象数组,而返回结果是一个元素类型的SOAPBodyElement的Vector对象。

相关推荐

    java webservice 详细开发示例介绍

    JAX-WS是对JAX-RPC的一种演进,它不再支持RPC/Encoded样式的消息传输,转而采用了文档/文本样式(Document/Literal),这主要是为了更好地支持现代Web服务的需求。 #### 三、JAX-WS详解 JAX-WS是当前Java平台中...

    Java6开发WebService入门

    JAX-WS提供了一种简便的方式来创建和部署Web服务,它使得开发人员能够轻松地将现有的Java类转换为Web服务接口,并且可以通过简单的注解来定义服务端点和服务方法。 #### 三、代码示例解析 下面是一段使用Java 6...

    java webService 中文与英文教程

    Java WebService主要基于SOAP(Simple Object Access Protocol)协议,它是一种基于XML的协议,用于交换结构化的和机器可读的信息。在Java中,我们通常使用JAX-WS(Java API for XML Web Services)框架来创建和消费...

    WebService入门案例java工程代码

    - **定义服务接口**:首先,我们需要定义一个Java接口,这个接口将暴露为WebService接口。接口中的方法将对应于Web服务的操作。 ```java public interface HelloWorld { String sayHello(String name); } ``` - *...

    xfire框架构建webservice应用(myecllipse自动代码生成 )

    XFire是一个轻量级的WebService框架,它提供了一种简单的方式来开发基于Java的Web服务和客户端应用程序。XFire支持SOAP 1.1和1.2协议,并且能够很好地与其他标准兼容,如WSDL和UDDI等。它具有以下特点: 1. **简洁...

    关于webservice的一些细节注意

    Web服务(WebService)是一种基于标准协议的,使得不同系统间能够进行互操作的网络应用程序。在Web服务中,XML(可扩展标记语言)用于数据表示,SOAP(简单对象访问协议)用于消息传输,WSDL(Web服务描述语言)用于...

    webserviceInvoker:JAVA动态调用WebService的框架

    这个JAVA的框架主要用于动态的调用WebService.通常情况下得WS调用都是使用wsdl4j等生成静态的stub存根类,然后再调用webservice.但是这样的局限性很大,比如在流程引擎中,调用的WS可能都是在界面上配置的.这就要求需要...

    spring+cxf编写简单的webservice接口

    @SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL) public class HelloWorldImpl implements HelloWorld { @Override public String sayHello(String name) { return "Hello, " + name; } } ``` 4. **...

    基于xfire的WebService开发

    总结来说,基于XFire的WebService开发提供了简洁、高效的Java Web服务解决方案。通过利用注解、Spring集成以及强大的客户端支持,XFire降低了开发复杂性,使得开发者能更专注于业务逻辑而不是底层的通信细节。无论是...

    jdk6 开发webservice

    JDK 6引入了JAX-WS(Java API for XML Web Services),它是一个标准的、基于注解的框架,简化了Web Service的开发流程。以下是对标题和描述中涉及的知识点的详细说明: 1. **JAX-WS**: JAX-WS是Java平台的一个核心...

    webservice

    - 支持 document/literal 样式 - 支持 WS-I Basic Profile 1.1 - 支持消息传输优化机制(Message Transmission Optimization Mechanism, MTOM) #### 四、JAX-WS 开发环境准备 **1. JDK 要求** - JDK 版本:`...

    webservice客户端以及服务端

    Web服务是一种基于网络的、平台无关的交互方式,它允许不同的系统之间进行数据交换和功能调用。在本文中,我们将深入探讨Web服务的核心概念,包括服务端和客户端的实现,特别是关注Java环境下的实现——使用JDK原生...

    jax-ws WebService客户端与服务端工程.rar

    - **@SOAPBinding**:用于指定SOAP绑定样式,如RPC/encoded、RPC/literal或Document/literal。 - **端点发布**:使用`Endpoint`类的`publish()`方法,可以将服务实例部署到一个特定的网络地址上。 3. **JAX-WS...

    JAVA CXF webservice的示例代码

    @SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL) public class HelloWorldServiceImpl implements HelloWorldService { @Override public String sayHello(String name) { return "Hello, " + name; }...

    MyEclipse9.0开发WebService

    设置SOAP绑定类型为“Document/Literal Wrapped”,并决定是否在项目中生成WSDL(Web Service Description Language)文件。 ### 步骤四:启动服务并测试 发布服务到服务器(这里略过具体步骤),然后通过查看`sun...

    webservice cxf 开发实战

    开发过程中,开发者会学习如何使用CXF生成WSDL,这可以基于Java类或者接口自动生成,反之亦然。此外,理解数据绑定和消息交换模式(如RPC/Encoded、Document/Literal等)也是重要的一步。 在RESTful服务的实现中,...

    axis2 发布webservice

    注解如`@WebService`用于标记服务接口,`@WebMethod`用于标记服务方法。 - 服务实现类需要继承自`org.apache.axis2.engine.AxisServer`或实现`org.apache.axis2.i18n.Messages`接口。 3. **构建服务存根**: - ...

    JDK+CXF实现webservice简单案例

    WEBSERVICE的核心标准是基于SOAP(Simple Object Access Protocol)和WSDL(Web Services Description Language),它们定义了服务接口和服务位置。在这个"JDK+CXF实现webservice简单案例"中,我们将探讨如何利用...

    Axis2开发webservice总结.doc

    在Axis2中,Web服务的消息内容遵循SOAP(Simple Object Access Protocol)标准,其编码方式通常为“document/literal”。SOAP消息必须符合WS-I基本纲要(WS-I Basic Profile Version 1.0)的规定。此外,XML用于数据...

Global site tag (gtag.js) - Google Analytics