这一章节将会非常非常的简单,因为在前文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服务的开发. 好像没有多少人讨论, 大多数的话题都是...
Spring Web Service 简单使用,配合JAX-B生成的Pojo,直接部署即可运行。
详细讲述了spring的基本内容,IOC、AOP、MVC、JDBC等等,由易到难,逐步深入,是初学spring不错的选择
第一章:Spring Web MVC入门 包括:是什么、能干什么、有什么、各个组成部分的功能、HelloWorld等 第二章:理解DispatcherServlet 包括:功能、配置、上下文关系、初始化顺序等 第三章:注解式控制器开发详解 ...
CXF Spring Web Service 程序,希望对大家有用!!
关于Spring的69个面试问答——终极列表
Spring Hibernate 简明教程 夏昕
简易版教程,可供新手学习参考使用,其中附有详细的代码说明和对应的案例。最后还有演示效果。
Spring2.5开发简明教程中文版 想学习Spring 的朋友一定要下哦!!
《Spring Web Flow权威指南》介绍了Spring Web Flow的构建系统Spring Jumpstart、Spring Web Flow架构和基础知识,并结合示例讲述了Spring Web Flow的高级概念、流执行管理和驱动,同时说明了如何测试流。...
Spring Web Services 官网 Spring Web Services API。 Spring Web Services 开发文档。
使用XFire+Spring构建Web Service使用XFire+Spring构建Web Service使用XFire+Spring构建Web Service使用XFire+Spring构建Web Service使用XFire+Spring构建Web Service使用XFire+Spring构建Web Service
精通Spring4.0 企业应用开发实战——ISBN 978-7-121-30443-9 完整高清带目录。
Dwr2+Struts2+Spring2.5+Hibernate3实战——用户登录注册系统
最新版spring-web-5.2.3.RELEASE和spring-webmvc-5.2.3.RELEASE
原来的jax-ws不知道为什么总是不成功,最后放弃,换成这个。具体过程可以参考官网:http://docs.spring.io/spring-ws/site/reference/html/tutorial.html
NULL 博文链接:https://elim.iteye.com/blog/1900937
Spring应用开发实战,光盘中附录B,包含Web Service WS的详细讲解。
spring web mvc 基础教程简单易学 适合入门
spring webflow