这一章节将会非常非常的简单,因为在前文code上做的修改只有4行。虽然我知道Namespace是个专业的规范,但是我对于wsdl的namespace相关概念太不熟悉了,按照我现在的认知,在这里使用非常鸡肋。
首先先思考一个场景:在一个Endpoint内,可以有多个方法来接受不同业务的请求。同时, 发起方只传递了一个uri和参数User,因此是如何来确定由具体哪个方法来接收呢?答案就是根节点名(localPart)…… 对于前文的例子来说,接受方法的选择,仅仅依靠的是根节点名user,更重要的是对于哪个Endpoint实现类的选择也是没有的。换句话说,不管你按照业务分了多少个endpoint,每个endpoint中分了多少个方法,这些方法就好像扔进了一个水池里,是混在一起的,而你只能通过根节点名选择执行的方法,这样,就不能有两个相同根节点名的方法并存。这样的局面我并不能接受。
所以我开始研究namespace的用法,但是结果依然让我失望,namespace也无法帮助我选择endpoint的方法。以下,我们先修改代码,看看namespace最最简单的用法是什么样的吧。
首先,修改
User.java,在类名前加上namespace的注解
@XmlRootElement(name = "user",namespace = "http://mycompany.com/hr/schemas")
然后,在每一个属性的setter前也加入注解
@XmlElement(namespace = "http://mycompany.com/hr/schemas")
public void setId(int id) { this.id = id; }
@XmlElement(namespace = "http://mycompany.com/hr/schemas")
public void setName(String name) { this.name = name; }
说明:注解本身,顾名思义,无需解释。这里有几个注意点:
1. 属性的注解为什么要加在setter上?只要在类名前加上@XmlAccessorType(XmlAccessType.FIELD),就可以直接在属性上加注解了。
2. 为什么要在类名和属性上反复写相同的namespace?可以只在类名前加,但是转换成XML以后的字符串会有不同。简单的场景下,两种都兼容,但是我后面需要实现一个特性,而这个特性要求我这么做。这也是让我很不爽的地方。
3. namespace的值有什么要求吗?还记得在user.xsd中定义的targetNamespace吗?嗯,当然不需要一致,而这里写成一致,对后面也是有帮助的,所以就这么着吧。但是一定要和@Endpoint中的namespace属性一致,这个后面会贴出来。
UserEndpoint.java
@PayloadRoot(localPart = "user", namespace = "http://mycompany.com/hr/schemas")
@ResponsePayload
public User handle(@RequestPayload User user) throws Exception {
添加了namespace属性,无需多说,没什么需要注意的。
使用第二章的第二个测试方法testSourceSend()进行测试,在请求参数转换后,打一句输出语句,就能看到添加了namespace后的User会转换成什么样子。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user xmlns="http://mycompany.com/hr/schemas">
<id>1</id>
<name>chenzhouce</name>
</user>
干脆贴出不在属性上加注解后转换的效果吧:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:user xmlns:ns2="http://mycompany.com/hr/schemas">
<id>1</id>
<name>chenzhouce</name>
</ns2:user>
这两种形式在现在的case中都是能通过的,至于含义上的区别,这里就不讲了,麻烦,也讲不太清楚。
这就是最简单的namespace使用,如果client端和server端有一处没有配置,或者两处不一致,就不能通过,server端会出现No endpoint mapping found的警告。
回过头,之所以说namespace鸡肋,是因为它虽然也是用来endpoint执行方法选择的,但是在与jaxb2直接转换的配合中,完全和localPart重复了,因为一个User就对应了主namespace.....
我也找过有没有没注意的地方,但是没有找到,而且大把的时间其实是花在了一个坑上。。这个坑我一定会在后面说的。。。我觉得namespace一定有它应该存在的规范,只是我不知道。。
代码提交到github上了,传送门:
https://github.com/chenzhouce/spring-webservice-demo/blob/Section_Namespace/src/main/java/com/zchen/User.java
注意:我放在了一个branch里Section_Namespace。前章节的内容依然在Master分支。
分享到:
相关推荐
Spring Web Service是Spring社区基于Spring提供的一个关注于创建”文档驱动”的Web Service的模块, 它的主要目标是方便基于”契约优先”(Contract-First)的SOAP服务的开发. 好像没有多少人讨论, 大多数的话题都是...
《Spring2.5开发简明教程中文版》是针对初学者设计的一份全面而实用的教程,涵盖了Spring框架的核心概念和基本用法。本教程共分为1-4章,每章均配有书签,便于读者查阅和复习。下面将详细阐述这四章中的主要知识点。...
《Spring Web Service实战篇(1)》主要涵盖了在Java环境中使用Spring框架构建Web服务的相关技术。本实战篇将深入探讨Spring Web Service的核心概念、架构设计以及实现步骤,旨在帮助开发者熟练掌握这一强大的工具。 ...
《Java Web开发实践教程——从设计到实现(第2版)》是一本深入探讨Java Web技术的权威指南,尤其适合初学者和有一定基础的开发者。本教程通过PPT的形式,以直观、易懂的方式讲解了从项目规划到实际开发的全过程。在...
Spring Web Service 简单使用,配合JAX-B生成的Pojo,直接部署即可运行。
Spring 2.5 开发简明教程中文版是一份针对初学者和中级开发者的学习资源,由四川农业大学信息与工程技术学院的张勇编写。本教程旨在帮助读者掌握Spring框架的2.5版本,这一版本在Spring的历史中具有重要的地位,因为...
Spring 2.5 开发简明教程 Spring 是一个开源的 Java 平台,它主要为 J2EE 应用程序提供了一个轻量级的框架,简化了企业级应用的开发。Spring 2.5 版本是该框架的一个重要里程碑,引入了许多新特性和改进,使得开发...
这篇博客可能讨论的是如何将这三个技术——XFire、iBatis和Spring——集成在一起,构建一个Web服务应用程序。在这样的集成中,Spring可以管理整个应用的生命周期,包括XFire的Web服务和iBatis的数据访问层。通过...
《Spring Web Flow权威指南》介绍了Spring Web Flow的构建系统Spring Jumpstart、Spring Web Flow架构和基础知识,并结合示例讲述了Spring Web Flow的高级概念、流执行管理和驱动,同时说明了如何测试流。...
与 Spring Web MVC 并行地,Spring Framework 5.0 引入了响应式栈——一个名为 Spring WebFlux 的 Web 框架,该框架的命名也是基于其源模块 `spring-webflux`。本节将重点讨论 Spring Web MVC。 #### 二、...
Spring Web Services 官网 Spring Web Services API。 Spring Web Services 开发文档。
这篇博客“Web Service实践之——开始XFire”可能详细介绍了如何使用XFire来实现Web服务。 在Web服务的世界里,SOAP(Simple Object Access Protocol)是用于交换结构化信息的标准协议,而WSDL(Web Services ...
【使用XFire+Spring构建Web Service】是一种高效且灵活的方法,尤其适合于那些希望利用Spring框架的优秀特性来开发Web Service应用的开发者。XFire是一个先进的Web Service框架,与Axis2并列为新一代的选择,因其...
精通Spring4.0 企业应用开发实战——ISBN 978-7-121-30443-9 完整高清带目录。
Spring是目前非常流行的Java应用框架,其提供了丰富的开发组件,WS(Web Service)是其中重要的组成部分。Web Service是一种基于Web的分布式计算技术,它使得不同应用程序能够通过Internet通信和交互。Spring对WS的...
【Web Service实例详解——Spring+Hibernate+Web Service】 在当今的软件开发中,Web Service作为一项重要的技术,被广泛应用于不同系统之间的数据交互和集成。本实例将详细讲解如何使用Spring、Hibernate和Web ...
【标题】:“实战Web Service —— 使用Apache CXF开发Web服务的教程” 【内容详解】: Web服务是一种基于开放标准的、平台无关的接口技术,它允许不同系统间的应用程序进行交互。Apache CXF是一个开源的Java框架,...