Web Service进阶(五)SOAPBinding方式讲解

Java API for XML Web Services (JAX-WS) 2.0 (JSR 224) Standard Implementation (SI)
  JAX-WS2.0是JAX-RPC 1.1 (JSR 101)的后续版本。

1. JAX-WS 仍然支持 SOAP 1.1 over HTTP 1.1,因此互操作性将不会受到影响,仍然可以在网上传递相同的消息。
2. JAX-WS 仍然支持 WSDL 1.1,因此您所学到的有关该规范的知识仍然有用。WSDL 2.0 规范已经接近完成,但在 JAX-WS 2.0 相关工作结束时其工作仍在进行中。
3. JAX-RPC 和 JAX-WS 都支持 SOAP 1.1。JAX-WS 还支持 SOAP 1.2。
4. WSDL 1.1 规范在 HTTP 绑定中定义,这意味着利用此规范可以在不使用 SOAP 的情况下通过 HTTP 发送 XML 消息。
5. JAX-RPC 忽略了 HTTP 绑定。而 JAX-WS 添加了对其的支持。
6. JAX-RPC 支持 WS-I Basic Profile (BP) V1.0。JAX-WS 支持 BP 1.1。(WS-I 即 Web 服务互操作性组织。)

在JAX-WS时代,wscompile已经被wsimport与wsgen代替。wsimport用于导入wsdl并生成可移植性组件(artifact)wsgen生成编译后的SEI并生成可移植性组件(artifact). 当前wsgen并不产生wsdl.WSDL在部署的时候产生。但通过配置项可让wsgen产生wsdl。
wscompile主于用于早期的RPC,使用wscompile需要编写一个config.xml文件,作为wscompile的输入。

昨天在GF3上部署webservice,在webserivce上添加了SOAPBinding(style=Style.RPC),[这个annotation最好写在类层次上,写在方面层次上容易与出现与类出现冲突],结果部署失败。后来发现写成SOAPBinding(style=Style.RPC,use=literal)才可以。从Google上找到一点证据:RPC/encoded is not a supported style/use mode with JAX-WS 2.0. JAX-WS2.0 is fully compliant with the WS-I Basic Profile 1.1 which mandates literal mode. The supported style/use modes are: rpc/literal and document/literal.

JAX-WS 中的SoapBinding目前支持3种方式:

1)Document Wrapped(默认使用方式,由下面的错误可见):
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,use=SOAPBinding.Use.LITERAL,parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
2)Document Bare:
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,use=SOAPBinding.Use.LITERAL,parameterStyle=SOAPBinding.ParameterStyle.BARE)
3)RPC:
@SOAPBinding(style=SOAPBinding.Style.RPC,use=SOAPBinding.Use.LITERAL,parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)

另外 The java.util.Collection classes cannot be used with rpc/literal or document/literal BARE style due to a limitation in JAXB. However, they do work in the default document/literal WRAPPED style

本文上半部分出自 “天下无贼” 博客,请务必保留此出处http://guojuanjun.blog.51cto.com/277646/1196736

本文下半部分为作者原创内容,转载时请注明出处,维护著作权,从你我做起,从身边做起!

为了更形象具体的解释以上三种绑定方式,作者采用示例代码的形式进行演示,并对三种绑定方式进行对比。

1)Document Wrapped:

//它是一个注解,用在类上指定将此类发布成一个ws.
//修改目标空间,修改服务名,端口名.在wsdl那里的xml文件显示对应的修改信息
@WebService(targetNamespace = "http://ujn.cn/",serviceName = "UserService", portName = "UserPort")
public interface UserService {
// 添加用户
@WebMethod
@ResponseWrapper(localName = "add_Status", targetNamespace = "http://ujn.cn/", className = "cn.ujn.edu.dto.User")
@RequestWrapper(localName = "userInfo", targetNamespace = "http://ujn.cn/", className = "cn.ujn.edu.dto.User")
@WebResult(name="add_Status")
public int add(String userStr);
// 查找用户
@WebMethod
@WebResult(name="login_Status")
public int login(String userStr);
}

刚开始写注解的时候,感觉应该会很简单,其实不然。对于这三种绑定方式,我们首先应该考虑应用场景,针对不同的应用场景选择不同的绑定形式。后面会具体分析绑定方式的选择问题。

在Document wrapped方式中,我们设置的@WebResult(name="add_Status")和@WebParam(name="userInfo")其中的name属性值必须进行包装,相关代码

// 添加用户

<span style="font-size:18px;">@WebMethod
	@ResponseWrapper(localName = "add_Status", targetNamespace = "http://ujn.cn/", className = "cn.edu.ujn.dto.User")
	@RequestWrapper(localName = "userInfo", targetNamespace = "http://ujn.cn/", className = "cn.edu.ujn.dto.User")
	@WebResult(name="add_Status")
	public int add(@WebParam(name="userInfo")String userStr);</span>
<span style="font-size:18px;">其中,相应包装类为className = "cn.edu.ujn.dto.User",其具体内容如下:</span>
<span style="font-size:18px;">public class User {
	private String userInfo;
	private String login_Status;
	public String getUserInfo() {
		return userInfo;
	}
	public void setUserInfo(String userInfo) {
		this.userInfo = userInfo;
	}
	public String getLogin_Status() {
		return login_Status;
	}
	public void setLogin_Status(String login_Status) {
		this.login_Status = login_Status;
	}
}</span>
<span style="font-size:18px;">在进行参数名的替换时,会将localName = "userInfo"在className = "cn.edu.ujn.dto.User"中匹配,若匹配成功,则进行替换操作,替换后的效果可以在wsdl文件中查看,如下图1-1所示,否则编译器会报如图1-2所示的错误:</span>

图1-1 wsdl文档

图1-2 错误提示

出现此错误的原因正是因为所定义的变量userInfo1未存在于包装类user中。

此种绑定形式的缺点是在进行参数初始化时需进行两次new操作(分别为in和out阶段),浪费内存,当然可以考虑使用工厂设计模式。

  注:在进行重复部署服务的时候,应当将Tomcat容器中的web项目删除,否则会因为缓存的原因而看不到新部署的服务效果。

2)DocumentBare:

其指定形式如下:

<span style="font-size:18px;">public interface UserService {
	// 添加用户
	@WebMethod
	@WebResult(name="add_Status")
	public int add(@WebParam(name="userInfo")String userStr);
	// 查找用户
	@WebMethod
	@WebResult(name="login_Status")
	public int login(@WebParam(name="userInfo")String userStr);
}</span>
<span style="font-size:18px;">其中,最重要的参数设置是红色部分的内容。此种方式对于数据类型简单如int、String、array类型的数据使用,对于list、map等集合复杂类型的数据不适用。此种形式的优点是节省内存。</span>

3)RPC

其指定形式如下:

public interface UserService {

// 添加用户

@WebMethod

@WebResult(name="add_Status")

public int add(@WebParam(name="userInfo")String userStr);

// 查找用户

@WebMethod

@WebResult(name="login_Status")

public int login(@WebParam(name="userInfo")String userStr);

}

至此,示例代码演示到此。希望朋友们可以有所受益!

美文美图

Web Service进阶(五)SOAPBinding方式讲解的更多相关文章

  1. Web Service进阶(六)SOAPBinding绑定方式异常 is not found. Have you run APT to generate them

    当在类中填充相应方法时,提示如下错误: 出现以上错误的原因就是在注解中没有添加@SOAPBinding(style=SOAPBinding.Style.RPC)这句话.估计也与JDK的版本相关,这方面 ...

  2. 开发Web Service的几种方式

    本文作者在学习使用Java开发Web Service(不包括Restful)时,由于不知道Java有这么多框架支持开发Web Service一度陷入迷惘,不知道这些框架各有 什么不同,各有什么优缺点. ...

  3. Web Service进阶(三)HTTP-GET, HTTP-POST and SOAP的比较

    XML Web Service支持三种协议来与用户交流数据.这三种协议分别是: 1.SOAP:Simple Object Access Protocol 2.HTTP-GET 3.HTTP-POST ...

  4. Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice

    浅谈SOAP Webservice和RESTful Webservice REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.RE ...

  5. Web Service进阶(四)WebService注解

    @WebService 1.serviceName: 对外发布的服务名,指定 Web Service 的服务名称:wsdl:service.缺省值为 Java 类的简单名称 + Service.(字符 ...

  6. Web Service进阶(一)运行原理

    利用清明小假期,温习了一遍Web Service的相关内容,对其工作原理进行了简要总结.以供有需求的朋友和自己日后参考.文章若有不当之处,敬请朋友们提出宝贵建议,以求共勉. Web服务中,我们应该首先 ...

  7. Spring学习(七)——开发Web Service的几种方式

    本文作者在学习使用Java开发Web Service(不包括Restful)时,由于不知道Java有这么多框架支持开发Web Service一度陷入迷惘,不知道这些框架各有 什么不同,各有什么优缺点. ...

  8. Web Service进阶

    选框架犹如选媳妇,选来选去,最后我还是选了“丑媳妇(CXF)”,为什么是它?因为 CXF 是 Apache 旗下的一款非常优秀的 WS 开源框架,具备轻量级的特性,而且能无缝整合到 Spring 中. ...

  9. Web Service进阶(二)如何用Apache TCPMon来截获SOAP消息

    注:以下是关于TCPMon的一些使用常识,如果不需要或是已经熟悉就不用往下看了. 在WebService服务器和客户机之间会传递SOAP消息,有时我们需要得到这些消息以便调试,而Apache的TCPM ...

随机推荐

  1. c语言第四次作业e

    ---恢复内容开始--- (一)改错题 输出三角形的面积和周长,输入三角形的三条边a.b.c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数):否则,输出"Th ...

  2. rasa_core:基于机器学习的对话引擎

    用机器学习管理你的对话,让它提升每一个对话.Rasa Core引导对话,考虑对话的历史和外部环境. 而不是成千上万的规则,Rasa 从真正的对话中挑选模式. 现在是扔掉你的状态机的时候了! Manag ...

  3. 备忘:MySQL中修改表中某列的数据类型、删除外键约束

    -- MySQL中修改表中某列的数据类型 ALTER TABLE [COLUMN] 表名 MODIFY 列名 列定义; -- 删除外键约束 SHOW CREATE TABLE 表名; -- 复制CON ...

  4. Eclipse插件安装4种方法

    第一种:直接复制法 假设Eclipse的安装目录在C:\eclipse,解压下载的eclipse 插件或者安装eclipse 插件到指定目录AA(如:c:\AA)文件夹,打开AA 文件夹,在AA文件夹 ...

  5. vue中的eventBus

    在vue2中,父子组件传递数据,父组件可以直接传递数据进子组件,而子组件通过调用父组件传递进来的方法,将自己的数据传递回去. 那兄弟组件之间,或者是兄弟组件的子组件之间如何传递呢? 当然vuex是一种 ...

  6. C# ref与out

    ref参数是引用,out参数为输出参数.我写一个控制台的程序来说明一下两者的特点和区别: class Program { 3 public static void RefMethod( ref int ...

  7. 继承自 DevExpress 17.2 的自定义控件如何在工具箱显示

    最近把DevExpress版本从13.1升级到了17.2,结果发现继承自DevExpress的自定义控件居然在工具箱中消失了,弄了两天还是没有任何头绪,部分自定义Dev控件可以正常出现,但大部分自定义 ...

  8. Linux下DIR,dirent,stat等结构体详解

    摘自:http://www.liweifan.com/2012/05/13/linux-system-function-files-operation/ 最近在看Linux下文件操作相关章节,遇到了这 ...

  9. Java第7次实验提纲(多线程)

    PTA与参考资料 题集:多线程 多线程实验参考文件 ThreadReading 实验-基础部分 1.1 基础题目MyThread类.自行完成题集合的:PrintTask 1.2 Runnable与匿名 ...

  10. APP自动化框架LazyAndroid使用手册(3)--核心API介绍

    作者:黄书力 概述 在前一篇博文中,简要介绍了一款安卓UI自动化测试框架LazyAndroid (http://blog.csdn.net/kaka1121/article/details/53204 ...