spring创建web项目_使用Spring WS创建合同优先的Web服务

spring创建web项目

1引言

本文介绍了如何使用来实现和测试SOAP Web服务
Spring Web Services项目 。 本示例将JAXB2用于(取消)编组。 为了开发服务,我将使用合同优先的方法,该方法首先定义服务合同,然后基于此合同实施服务。

本文分为以下几节:

  • 2解释申请
  • 3实施服务
  • 3.1创建合同
  • 3.2生成Java类
  • 3.3实现SOAP端点
  • 3.4配置应用程序
  • 4测试服务
  • 5附加信息
  • 5.1实施客户
  • 5.2内部运作方式

2解释申请

示例应用程序处理订单。 我们有一个前端控制器(messageDispatcher servlet),它将处理订单请求,调用服务以处理订单并返回结果。

Aplicacio

您可以在github上获取源代码。

3实施服务

3.1创建合同

由于我们将使用“合同优先”方法,因此创建合同的最简单方法是首先定义示例xml文档,然后,我们将使用工具生成合同。 以下是示例xml文档:

client-request.xml

<clientDataRequest xmlns="http://www.xpadro.spring.samples.com/orders"clientId="A-123"productId="C5FH"quantity="5" />

client-response.xml

<clientDataResponse xmlns="http://www.xpadro.spring.samples.com/orders" confirmationId="7890B"orderDate="2013-09-22"amount="15.50" />

为了创建模式,我们可以使用Trang,这是一个开放源代码工具,将允许我们从xml文档中生成xsd模式。 我已经将该库包含到项目构建路径中(可以从Trang 网站获得此jar),并且创建了一个Ant任务来执行转换:

generate-schema.xml

<project name="Ant-Generate-Schema-With-Trang" default="generate" basedir="."><property name="src.dir" location="src" /><property name="trang.dir" location="lib" /><property name="source.dir" location="${src.dir}/main/webapp/WEB-INF/schemas/samples" /><property name="schema.dir" location="${src.dir}/main/webapp/WEB-INF/schemas/xsd" /><target name="generate" description="generates order schema"><delete dir="${schema.dir}" /><mkdir dir="${schema.dir}" /><java jar="${trang.dir}/trang.jar" fork="true"><arg value="${source.dir}/client-request.xml" /><arg value="${schema.dir}/client-request.xsd" /></java><java jar="${trang.dir}/trang.jar" fork="true"><arg value="${source.dir}/client-response.xml" /><arg value="${schema.dir}/client-response.xsd" /></java></target>
</project>

一旦执行了Ant任务,它将生成架构。 由于模式是自动生成的,因此我们可能需要进行一些修改以使其适应我们的需求。 让我们来看看:

客户端请求

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.xpadro.spring.samples.com/orders" xmlns:orders="http://www.xpadro.spring.samples.com/orders"><xs:element name="clientDataRequest"><xs:complexType><xs:attribute name="clientId" use="required" type="xs:NCName"/><xs:attribute name="productId" use="required" type="xs:NCName"/><xs:attribute name="quantity" use="required" type="xs:integer"/></xs:complexType></xs:element>
</xs:schema>

客户端响应

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.xpadro.spring.samples.com/orders" xmlns:orders="http://www.xpadro.spring.samples.com/orders"><xs:element name="clientDataResponse"><xs:complexType><xs:attribute name="amount" use="required" type="xs:decimal"/><xs:attribute name="confirmationId" use="required" type="xs:NMTOKEN"/><xs:attribute name="orderDate" use="required" type="xs:NMTOKEN"/></xs:complexType></xs:element>
</xs:schema>

我们可以向这些架构添加不同的验证,但是在本示例中,我将只修改几种类型,例如clientId,productId和ConfirmationId(xs:string)和orderDate(xs:date)。 XML数据类型到Java类型的映射由JAXB完成。 您可以检查提供了哪些映射
在这里 。

为了完成该架构,我们将把response元素复制到请求架构中。 我创建了带有响应和请求的第三个架构:

客户端服务

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"elementFormDefault="qualified" targetNamespace="http://www.xpadro.spring.samples.com/orders"xmlns:orders="http://www.xpadro.spring.samples.com/orders"><xs:element name="clientDataRequest"><xs:complexType><xs:attribute name="clientId" use="required" type="xs:string" /><xs:attribute name="productId" use="required" type="xs:string" /><xs:attribute name="quantity" use="required" type="xs:integer" /></xs:complexType></xs:element><xs:element name="clientDataResponse"><xs:complexType><xs:attribute name="amount" use="required" type="xs:decimal" /><xs:attribute name="confirmationId" use="required" type="xs:string" /><xs:attribute name="orderDate" use="required" type="xs:date" /></xs:complexType></xs:element>
</xs:schema>

最后一步是写合同,通常用WSDL文件表示。 如果您不想手动创建它,Spring-ws项目为我们提供了一种从XSD模式生成此文件的方法。 您将在配置应用程序部分中看到第二种方法。

3.2生成Java类

我们将使用JAXB2生成请求和响应对象。 JAXB的XJC编译器将负责从我们之前生成的XSD架构转换这些对象。 它将作为Ant任务执行:

<project name="Ant-Generate-Classes-With-JAXB2" default="generate" basedir="."><property name="src.dir" location="src" /><property name="java.dir" location="src/main/java" /><property name="schema.dir" location="${src.dir}/main/webapp/WEB-INF/schemas/xsd" /><target name="generate"><exec executable="xjc"><arg line=" -d ${java.dir} -p xpadro.spring.ws.types ${schema.dir}/client-service.xsd" /></exec></target>
</project>

该任务将在xpadro.spring.ws.types包中创建Java类(您可能需要刷新项目)。

类型

3.3实现SOAP端点

端点接收未编组的消息有效负载,并使用此数据来调用订单服务。 然后它将返回服务响应,该响应将由端点适配器编组:

@Endpoint
public class OrderEndpoint {@Autowiredprivate OrderService orderService;@PayloadRoot(localPart="clientDataRequest", namespace="http://www.xpadro.spring.samples.com/orders")public @ResponsePayload ClientDataResponse order(@RequestPayload ClientDataRequest orderData) {OrderConfirmation confirmation = orderService.order(orderData.getClientId(), orderData.getProductId(), orderData.getQuantity().intValue());ClientDataResponse response = new ClientDataResponse();response.setConfirmationId(confirmation.getConfirmationId());BigDecimal amount = new BigDecimal(Float.toString(confirmation.getAmount()));response.setAmount(amount);response.setOrderDate(convertDate(confirmation.getOrderDate()));return response;}//date conversion
}

这是端点使用的注释的简短描述:

@Endpoint :将类注册为组件。 这样,将通过组件扫描检测到该类。

@PayloadRoot :将端点方法注册为请求的处理程序。 该注释将定义该方法可以处理的请求消息类型。 在我们的示例中,它将接收消息,其中其有效负载根元素具有与我们创建的XSD架构中定义的名称空间相同的名称空间,并且其本地名称是为请求定义的名称(clientDataRequest)。

@RequestPayload :指示要作为参数传递给方法的请求消息的有效负载。

@ResponsePayload ,指示将返回值用作响应消息的有效负载。

3.4配置应用程序

web.xml
应用程序配置(如数据源,transactionManager等)

<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:xpadro/spring/ws/config/root-config.xml</param-value>
</context-param>

加载应用程序上下文

<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

这是一个Servlet,它将充当处理所有SOAP调用的前端控制器。 它的功能是将传入的XML消息派生到端点,就像Spring MVC的DispatcherServlet一样。

<servlet><servlet-name>orders</servlet-name><servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:xpadro/spring/ws/config/servlet-config.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet><servlet-mapping><servlet-name>orders</servlet-name><url-pattern>/orders/*</url-pattern>
</servlet-mapping>

servlet-config.xml
此配置包含Web服务基础结构bean。

<!-- Detects @Endpoint since it is a specialization of @Component -->
<context:component-scan base-package="xpadro.spring.ws"/><!-- detects @PayloadRoot -->
<ws:annotation-driven/><ws:dynamic-wsdl id="orderDefinition" portTypeName="Orders" locationUri="http://localhost:8081/spring-ws"><ws:xsd location="/WEB-INF/schemas/xsd/client-service.xsd"/>
</ws:dynamic-wsdl>

在动态wsdl中,在locationUri属性中输入什么值都没有关系,因为它将由MessageDispatcherServlet处理。 因此,wsdl将在以下位置可用:

http:// localhost:8081 / spring-ws / orders / whatever / orderDefinition.wsdl

4测试服务

下面的示例创建一个模拟客户端,该客户端将访问Web服务:

@ContextConfiguration("classpath:xpadro/spring/ws/test/config/test-server-config.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class TestWebService {@AutowiredApplicationContext context;private MockWebServiceClient mockClient;@Testpublic void testValidOrderRequest() {Source requestPayload = new StringSource("<clientDataRequest xmlns='http://www.xpadro.spring.samples.com/orders' " +"clientId='123' productId='XA-55' quantity='5'/>");Source responsePayload = new StringSource("<clientDataResponse xmlns='http://www.xpadro.spring.samples.com/orders' " +"amount='55.99' confirmationId='GHKG34L' orderDate='2013-10-26+02:00'/>");RequestCreator creator = RequestCreators.withPayload(requestPayload);mockClient = MockWebServiceClient.createClient(context);mockClient.sendRequest(creator).andExpect(ResponseMatchers.payload(responsePayload));}@Testpublic void testInvalidOrderRequest() {Source requestPayload = new StringSource("<clientDataRequest xmlns='http://www.xpadro.spring.samples.com/orders' " +"clientId='456' productId='XA-55' quantity='5'/>");Source responsePayload = new StringSource("<SOAP-ENV:Fault xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>" +"<faultcode>SOAP-ENV:Server</faultcode><faultstring xml:lang='en'>Client [456] not found</faultstring></SOAP-ENV:Fault>");RequestCreator creator = RequestCreators.withPayload(requestPayload);mockClient = MockWebServiceClient.createClient(context);mockClient.sendRequest(creator).andExpect(ResponseMatchers.payload(responsePayload));}
}

此测试中使用的配置文件非常简单,仅包含对服务组件的扫描:

<context:component-scan base-package="xpadro.spring.ws"/>
<ws:annotation-driven/>

5附加信息

5.1实施客户

为了方便客户端访问Web服务,Spring为我们提供了WebServiceTemplate类。 此类包含用于发送和接收消息的方法,并且还使用转换器对(取消)编组对象。

我创建了一个充当服务客户端的测试:

@ContextConfiguration("classpath:xpadro/spring/ws/test/config/client-config.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class TestClient {@Autowired WebServiceTemplate wsTemplate;@Testpublic void invokeOrderService() throws Exception {ClientDataRequest request = new ClientDataRequest();request.setClientId("123");request.setProductId("XA-55");request.setQuantity(new BigInteger("5", 10));ClientDataResponse response = (ClientDataResponse) wsTemplate.marshalSendAndReceive(request);assertNotNull(response);assertEquals(new BigDecimal("55.99"), response.getAmount());assertEquals("GHKG34L", response.getConfirmationId());}
}

配置测试文件包含WebServiceTemplate配置:

<oxm:jaxb2-marshaller id="marshaller" contextPath="xpadro.spring.ws.types"/><bean class="org.springframework.ws.client.core.WebServiceTemplate"><property name="marshaller" ref="marshaller" /><property name="unmarshaller" ref="marshaller" /><property name="defaultUri" value="http://localhost:8081/spring-ws/orders" /> 
</bean>

只需记住在执行此测试之前使用已部署的Web服务应用程序启动服务器即可。

5.2内部运作方式

如果您只想实现Web服务,那么上一节将结束本文。 对于那些对它如何真正起作用感到好奇的人,我将尝试解释如何将请求映射到端点,这比到目前为止的解释要低一些。

当请求到达MessageDispatcher时,它依赖于两个组件:

  1. 它询问EndpointMapping哪个是适当的端点。
  2. 利用从映射接收到的信息,它使用端点适配器来调用端点。 适配器还支持参数解析器和返回类型处理程序。

端点映射

MessageDispatcher包含一个端点映射列表,每个端点映射都包含一个先前注册的方法端点的映射。 在我们的例子中,JAXB映射PayloadRootAnnotationMethodEndpointMapping已注册所有带有@PayloadRoot注释的方法。 如果消息的有效负载的合格名称解析为注册方法,则它将被返回给MessageDispatcher。 如果我们不注释我们的方法,它将无法处理请求。
序列1
端点适配器

然后,MessageDispatcher将询问其每个端点适配器是否支持当前请求。 在我们的情况下,适配器检查以下两个条件是否都成立:

  • 传递给该方法的至少一个参数使用@RequestPayload进行注释
  • 如果端点方法返回响应,则必须使用@ResponsePayload进行注释

如果返回了适配器,则它将调用端点,在将参数传递给方法之前将其解组。 当该方法返回响应时,适配器将封送它。

下图是此步骤的简化版本,以简化操作:

序列2

结论

我们已经看到了有关如何实现简单的Web服务然后对其进行测试的介绍。 如果您有兴趣,还可以看看如何使用MockWebServiceServer 测试客户端。

参考: XavierPadró博客博客中的JCG合作伙伴 Xavier Padro 使用Spring WS创建了合同优先的Web服务 。

翻译自: https://www.javacodegeeks.com/2014/02/creating-contract-first-web-services-with-spring-ws.html

spring创建web项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】电大中专新媒体营销实务 (15)作业 题库

1.新媒体在进行内容传播时&#xff0c;可以做到将文字、图片、视频等同时传播&#xff0c;呈现出&#xff08;&#xff09;的特点。 A.移动化 B.多元化 C.便捷性 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.第四媒体发展到宽带互联网阶段成为&#xff08;&…

mysql 返回多行数据_mysql – 如何连接多个表,包括查找表和返回行中的数据

我正在尝试显示一些简单的计算机游戏结果,并且可以轻松地在我的代码中逐行迭代结果.我想要它,以便每个游戏的所有相关数据都在每个记录中,所以我可以在一行输出所有数据,例如&#xff1a;> A队(得分45)对阵B队(得分55),比赛持续时间&#xff1a;5分钟> C队(得分60)对阵D队…

什么是网络光端机?网络光端机工作原理及功能介绍!

网络光端机&#xff0c;就是光信号传输的终端设备。由于目前技术的提高&#xff0c;光纤价格的降低使它在各个领域得到很好的应用。在远程光纤传输中&#xff0c;光缆对信号的传输影响很小&#xff0c;光纤传输系统的传输质量主要取决于光端机的质量&#xff0c;因为光端机负责…

使用@JsonIdentityInfo的Spring自定义序列化器

介绍 Spring中从JSON到JSON的序列化/反序列化已广泛用于基于Spring的现代应用程序中。 它基于杰克逊。 Jackson可以轻松地将任何POJO序列化为JSON&#xff0c;反之亦然。 这段代码写得很好。 我从未遇到任何问题。 当涉及到自定义序列化程序时&#xff0c;它将变得更加困难。 这…

【渝粤教育】电大中专电商运营实操 (15)作业 题库

1.目前菜鸟网络依赖大数据和云计算已实现了哪些功能&#xff08; &#xff09; A.智能分单 B.自动化仓库 C.以上都正确 D.智能发货 E.物流云加速 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;E 2.目前&#xff08; &#xff09;的电子商务呈现出巨大的发展潜力。 A…

java notify视频_一个很好的小例子来演示java中的wait()和notify()方法

任何人都可以在java中为我提供一个很好的小例子演示wait()和notify()功能.我尝试使用下面的代码,但它没有显示我的预期.public class WaitDemo {int i 10;int display() {System.out.println("Lexmark");i;return i;}}public class ClassDemo1 extends Thread {priv…

【渝粤教育】电大中专电子商务网站建设与维护 (22)作业 题库

1.阿里巴巴的创始人是&#xff08; &#xff09; A.丁磊 B.李彦宏 C.马化腾 D.马云 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;未作答 2.阿里巴巴目前的电子商务在哪个阶段&#xff08; &#xff09; A.资金流 B.物流 C.商品流 D.信息流 错误 正确答案&#xff1…

以太网交换机的用途有哪些?

交换机的主要功能包括物理编址、网络拓扑结构、错误校验、帧序列以及流控。交换机还具备了一些新的功能&#xff0c;如对VLAN&#xff08;虚拟局域网&#xff09;的支持、对链路汇聚的支持&#xff0c;甚至有的还具有防火墙的功能。接下来就由飞畅科技的小编带大家详细了解下交…

【渝粤教育】电大中专药理学基础 (3)作业 题库

1.关于巴比妥类药物药理作用的描述&#xff0c;错误的是&#xff08;&#xff09;。 A.镇静 B.催眠 C.麻醉 D.抗惊厥 E.镇痛 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;C 2.地西泮适应证不包括&#xff08;&#xff09;。 A.镇静催眠 B.抗癫痫和抗惊厥 C.肌紧张性…

交换机主要分为哪几类?

交换机&#xff08;Switch&#xff09;意为“开关”是一种用于电&#xff08;光&#xff09;信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。其他常见的还有电话语音交换机、光纤交换机等。 从广义上来看&…

java编程彩球滑梯作弊_课内资源 - 基于C++的学生成绩管理系统

1 系统分析1.1 学生成绩管理系统介绍班主任管家软件以学生信息、课程信息为基础&#xff0c;以品行表现成绩(辅导员、班主任、班级评议成绩)和业务课程成绩为评价依据&#xff0c;每学期评定一次奖学金&#xff0c;奖学金作为学生评定各种荣誉的主要依据&#xff0c;并将各种评…

【渝粤教育】电大中专财务管理与分析 (2)作业 题库

货币市场的主要功能是调节短期资金融通&#xff0c;下列不属于货币市场的特点的是&#xff08; &#xff09;。 A期限一般长于1年 B期限短 C交易目的是解决短期资金周转 D金融工具有较强的“货币性” 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2下列关于个人独…

Hibernate事实:如何“断言” SQL语句计数

介绍 Hibernate简化了CRUD操作&#xff0c;尤其是在处理实体图时。 但是任何抽象都有其代价&#xff0c;而Hibernate也不例外。 我已经讨论了获取策略和了解Criteria SQL查询的重要性&#xff0c;但是您可以做更多的事情来统治JPA。 这篇文章是关于控制Hibernate代表您调用SQL语…

交换机工作原理介绍

交换机是一种用于电&#xff08;光&#xff09;信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。交换机工作于OSI参考模型的第二层&#xff0c;即数据链路层。交换机拥有一条高带宽的背部总线和内部交换矩阵&am…

【渝粤教育】电大中专金融与税收作业 题库

1.根据马克思的货币需要量公式&#xff0c;在货币流通速度不变的条件下&#xff0c;执行流通手段的货币量取决于&#xff08;&#xff09;。 A.商品质量 B.商品生产技术条件 C.待销售商品价格总额 D.投机性货币需求 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2…

下载不了java应用程序_Java 7u45 - java webstart不会下载我的jar并执行应用程序,除非我显示java控制台...

首先&#xff0c;对不起我的英语&#xff0c;这不是我的母语。我的环境有&#xff1a;- jre 1.5.0_12(二进制)- jre 1.6.0_17(默认jre)- jre 1.7.0_45(二进制)我有两种方法可以通过Java Webstart启动应用程序&#xff1a;1)\\\javaws-1.5.0_12.exe \\\urClient-DAP2.jnlp2)&quo…

【渝粤题库】陕西师范大学500011 物理学史 作业(专升本)

《物理学史》作业 一、名词解释 1、伽利略“等末速度假设” 2、卡诺理想热机 3、光量子假设 4、阿拉果圆盘实验 5、活力守恒定律 6、牛顿主张的光的微粒说 7、卡诺提出的理想循环过程 8、法拉第圆盘实验 9、卡文迪许测量G的实验 10、卡诺定理 11、惠更斯原理 12、热质说 13、无…

将应用程序集成为Heroku附加组件

Heroku是受欢迎的平台即服务提供商&#xff0c;它为供应商提供了作为附件提供的选项。 Heroku客户可以以不同的方式使用加载项&#xff0c;但是典型的情况是“启动数据库”&#xff0c;“启动MQ”或“启动日志记录解决方案”。 将附加组件添加到您的帐户后&#xff0c;您可以连…

bitmap的java原理_布隆算法的原理及JAVA实现

Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合&#xff0c;但是并不严格要求100%正确的场合。Bloom Filter是一种空间效率很高的随机数据结构&#xff0c;它利用位数组很简洁地表示一个集合&#xff…

[渝粤教育] 中国地质大学 自动控制原理 复习题

《自动控制原理》模拟题 一.单选题 1.当输入为单位斜坡且系统为单位反馈时对于II型系统其稳态误差为() A.0 B.0.1/k C.1/k D.无穷大 2.I型系统开环对数幅频特性的低频段斜率为() A.-40(dB/dec) B.-20(dB/dec) C.0(dB/dec) D.20(dB/dec) 3.当输入为单位斜坡且系统为单位反馈时…