开发自上而下的Web服务项目

这是从Alessio Soldano编辑的Advanced JAX-WS Web Services手册中摘录的示例章节。

第一章介绍了自底向上创建Web服务端点的方法。 它允许非常快地将现有bean作为Web Service端点公开:在大多数情况下,将类转换为端点只需在代码中添加少量注释即可。

但是,当使用已定义的合同开发服务时,使用自顶向下方法要简单得多(有效),因为wsdl-to-java工具可以生成与WSDL匹配的带注释的代码。 这是在多种情况下(例如以下情况)的首选解决方案:

  • 创建一个服务,该服务遵循预先开发的XML Schema和WSDL;
  • 公开符合第三方规定的合同的服务(例如,使用已定义的一组消息调用该服务的供应商);
  • 在保持与较旧客户端的兼容性的同时,替换现有Web Service的实现(不得更改合同)。

在下一节中,将提供一个自上而下的 Web Service端点开发示例,以及有关开发人员在编码时必须意识到的约束的一些详细信息,无论选择哪种方法。

使用自上而下的方法创建Web服务

为了建立一个包括Web服务端点和JAX-WS客户端的完整项目,我们将使用两个Maven项目。 第一个将是一个标准的webapp-javaee7项目,其中将包含Web服务端点。 第二个只是一个快速启动的Maven项目,它将对Web Service执行一个测试用例。

让我们像往常一样开始创建服务器项目:

mvn -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=webapp-javaee7  -DarchetypeVersion=0.4-SNAPSHOT -DarchetypeRepository=https://nexus.codehaus.org/content/repositories/snapshots  -DgroupId=com.itbuzzpress.chapter2.wsdemo -DartifactId=ws-demo2 -Dversion=1.0 -Dpackage=com.itbuzzpress.chapter2.wsdemo  -Darchetype.interactive=false --batch-mode --update-snapshots archetype:generate

下一步将根据WSDL合同创建Web服务接口和存根。 步骤与为同一合同建立客户的步骤相似。 唯一的区别是wsconsume脚本会将生成的源文件输出到我们的Maven项目中:

$ wsconsume.bat -k CustomerService.wsdl -o ws-demo-wsdl\src\main\java

除了本章开始讨论的生成的类之外,我们还需要提供一个包含Web服务功能的服务端点实现

@WebService(endpointInterface="org.jboss.test.ws.jaxws.samples.webresult.Customer")
public class CustomerImpl implements Customer {public CustomerRecord locateCustomer(String firstName, String lastName, USAddress address) {CustomerRecord cr = new CustomerRecord();cr.setFirstName(firstName);cr.setLastName(lastName);return cr;}
}

端点实现类实现端点接口并通过@WebService批注引用它。 我们的WebService类什么也没做,只是使用接收到的参数作为输入创建一个CustomerRecord对象。 在一个真实的示例中,您将使用例如持久层来收集CustomerRecord。

一旦将实现类包含在项目中,则需要将项目打包并部署到目标容器,这将使用与该工具使用的相同的合约公开服务端点。

还可以在服务接口的@WebService wsdlLocation属性中引用本地WSDL文件,并将该文件包含在部署中。 这样可以准确地提供所提供的文档。

如果要将Web服务部署到WildFly应用程序服务器,则可以从管理控制台(如管理控制台)中检查端点现在是否可用。 选择“上层运行时”选项卡,然后单击“左侧子系统左侧”选项中包含的“ Web服务”链接:

image003

JAX-WS端点的需求

无论选择哪种方法来开发JAX-WS端点,实际的实现都需要满足一些要求:

  • 必须使用j avax.jws.WebServicejavax.jws.WebServiceProvider批注对实现类进行批注。
  • 实现类可以通过@WebService批注的endpointInterface元素显式引用服务终结点接口,但这不是必需的。 如果@WebService中没有指定endpointInterface,服务端点接口被隐含的实现类定义。
  • 实现类的业务方法必须是公共的,并且不能声明为静态或最终的。
  • javax.jws.WebMethod批注将用于公开给Web服务客户端的业务方法。 如果没有使用@WebMethod注释任何方法,则将公开所有业务方法。
  • 向Web服务客户端公开的业务方法必须具有与JAXB兼容的参数和返回类型。
  • 实现类不能声明为final,并且不能抽象。
  • 实现类必须具有默认的公共构造函数,并且不能定义finalize方法。
  • 实现类可以在其方法中为生命周期事件回调使用javax.annotation.PostConstructjavax.annotation.PreDestroy注释。

构建和运行JAX-WS客户端的要求

JAX-WS客户端可以是任何Java项目的一部分,并且不需要明确要求它是部署在JavaEE容器上的JAR / WAR归档的一部分。 例如,客户端可以简单地包含在快速入门Maven项目中,如下所示:

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=com.itbuzzpress.chapter2.wsdemo -DartifactId=client-demo-wsdl -Dversion=1.0 -Dpackage=com.itbuzzpress.chapter2.wsdemo -Dversion=1.0 -Darchetype.interactive=false --batch-mode

由于您的客户端需要引用端点接口和存根,因此需要提供它们或者从服务器项目复制它们,或者使用wsconsume再次生成它们:

$ wsconsume.bat -k CustomerService.wsdl -o client-demo-wsdl\src\main\java

现在包括一个最小的Client Test应用程序,它是JUnit测试用例的一部分:

public class AppTest extends TestCase {public void testApp()  {CustomerService service = new CustomerService();Customer port = service.getCustomerPort();CustomerRecord record = port.locateCustomer("John", "Li", new USAddress());	System.out.println("Customer record is " +record);assertNotNull(record);}
}

编译并运行测试

为了成功运行WS客户端应用程序,需要正确设置类加载器,以包括所需的JAX-WS实现库(以及所需的传递依赖项(如果有))。 根据客户端要在其中运行的环境,这可能意味着向类路径添加了一些jar,或者向Maven依赖关系树添加了一些工件依赖项,正确设置了IDE等。

由于Maven用于构建包含客户端的应用程序,因此您可以按以下方式配置pom.xml ,使其包含对JBossWS的依赖关系:

<dependency><groupId>org.jboss.ws.cxf</groupId>  <artifactId>jbossws-cxf-client</artifactId>  <version>4.2.3.Final</version><scope>provided</scope>
</dependency>

现在,您可以执行测试用例,该用例将调用JAX-WS API以使用JBossWS服务客户端调用。

mvn clean package test

专注于客户端使用的JAX-WS实现

通过在应用程序类加载器中查找META-INF / services / javax.xml.ws.spi.Provider资源,可以在运行时选择要用于运行JAX-WS客户端的JAX-WS实现。 每个JAX-WS实现都有一个库(jar),该库包含该资源文件,该资源文件在内部引用实现JAX-WS SPI提供程序的适当类。

在WildFly 8.0.0.Final应用程序服务器上,JAX-WS实现包含在文件jbossws-cxf-factories-4.2.3.FinalMETA-INF / services / javax.xml.ws.spi.Provider中:

org.jboss.wsf.stack.cxf.client.ProviderImpl

因此,控制构建应用程序类加载器的类路径中包含哪些工件或jar库非常重要。 如果找到多个实现,则顺序很重要,因此将使用类路径中的第一个实现。

避免任何类路径问题(从而加载另一个JAX-WS实现)的最安全方法是将java.endorsed.dirs系统属性设置为包含jbossws-cxf-factories.jar; 如果不这样做,请确保没有在类路径之前包含其他META-INF / services / javax.xml.ws.spi.Provider资源,这将触发另一个JAX-WS实现。

最后,如果打算将JAX-WS客户端作为JavaEE应用程序的一部分在WildFly上运行,则将自动选择JBossWS JAX-WS实现来为客户端提供服务。

http://www.itbuzzpress.com/ 该摘录摘自“ Advanced JAX-WS Web Services ”一书,在该书中,您将学习基于SOAP的Web服务体系结构的概念,并获得有关在企业中构建和部署Web服务的实用建议。

本书从设置开发环境的基础知识和最佳实践入手,以清晰简洁的方式介绍了JAX-WS的内部细节。

您还将了解可用于创建,编译和测试SOAP Web服务的主要工具包,以及如何解决常见问题,例如调试数据和保护其内容。

您将从这本书中学到什么:

  • 使用SOAP Web服务迈出第一步。 安装开发和测试应用程序所需的工具。
  • 使用自上而下和自下而上的方法开发Web服务。
  • 使用Maven原型加快Web服务的创建。
  • 深入探讨JAX-WS类型的详细信息:Java到XML的映射以及XML到Java的映射
  • 在WildFly 8和Tomcat上开发SOAP Web服务。 在WildFly上运行本机Apache CXF。
  • 保护Web服务。 将身份验证策略应用于您的服务。 加密通信。

翻译自: https://www.javacodegeeks.com/2014/09/developing-a-top-down-web-service-project.html

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

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

相关文章

垃圾收集:提高吞吐量

这篇文章的灵感来自于在内存管理术语中的“ Pig in the Python ”定义。 显然&#xff0c;该术语用于解释GC反复促进大对象世代相传的情况。 据推测&#xff0c;这样做的效果类似于Python吞下整个猎物&#xff0c;只是在消化过程中被固定住了。 在接下来的24小时里&#xff0c…

大叔手记(12):我的一次面试经历(谈大叔如何应对面试官)

本文目的 写本文的目的&#xff0c;大叔不是为了装逼&#xff08;虽然说话的口气有时候也确实有点装逼&#xff0c;性格导致的&#xff0c;咳。。。我得改&#xff09;&#xff0c;其实大叔在公司也只是小罗罗&#xff0c;本文的目的主要是为了向大家展示如何通过各种软技能应对…

认识Mahout下的云计算机器学习

认识Mahout下的云计算机器学习 Apache Mahout 是 ApacheSoftware Foundation (ASF) 旗下的一个开源项目&#xff0c;提供一些可扩展的机器学习领域经典算法的实现&#xff0c;旨在帮助开发人员更加方便快捷地创建智能应用程序&#xff0c;并且&#xff0c;在 Mahout 的最近版本…

NetBeans 8.0的五个新性能提示

NetBeans 8.0引入了几个新的Java提示 。 尽管有许多与Java Persistence API相关的新提示&#xff0c;但我还是关注Performance类别中的五个新提示。 NetBeans 8.0引入的五个新的“性能提示”是&#xff1a; 已装箱价值的装箱 冗余String.toString&#xff08;&#xff09; …

机智云小程序启蒙:WebSocket网页控制

机智云小程序启蒙&#xff1a;WebSocket网页控制 机智云Web版的JS远程控制设备&#xff0c;是调用了机智云开放的Open API和WebSocket API来实现的。这个是设计小程序最好的基础&#xff0c;也可以使无安卓设备的用户用网页远程控制设备。 其中&#xff0c;Open API用到的接口…

Web service 超过了最大请求长度错误解决

Web service 超过了最大请求长度错误解决 System.Web.Services.Protocols.SoapException: 运行配置文件中指定的扩展时出现异常。 ---> System.Web.HttpException: 超过了最大请求长度。 在 System.Web.HttpRequest.GetEntireRawContent() 在 System.Web.HttpRequest.ge…

动态规划--图像压缩

<算法设计与分析> --王晓东 题目描述和解析参照&#xff1a;http://blog.csdn.net/liufeng_king/article/details/8648195 他在那里分析得非常的详细。我也是按照这种思路来解的&#xff0c;而且算法设计与实现的课件上也是这么个解法。 主要是理解这个公式&#xff0c;…

oracle 存储过程的基本语法 及注意事项

oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字( 参数1 IN NUMBER, 参数2 IN NUMBER) IS变量1 INTEGER :0;变量2 DATE;BEGIN END 存储过程名字2.SELECT INTO STATEMENT 将select查询的结果存入到变量中&#xff0c;可以同时将多个列存…

function——函数声明头的提升和预解析

函数&#xff1a; 即function语句的集合&#xff0c;就是将多个语句封装到一起&#xff1b; 函数的执行要会自己遍历&#xff0c;遇见函数 a&#xff08;&#xff09;&#xff1b;执行语句&#xff0c;就要移交控制权&#xff0c;函数执行完毕之后&#xff0c;控制权又移交回…

在JDeveloper 12.1.3中将Java API用于WebSockets

介绍 最新版本的JDeveloper 12c&#xff08;12.1.3.0&#xff09;和WebLogic Server 12.1.3一起提供了一些新的Java EE 7功能。 其中之一是对用于WebSocket的JSR 356 Java API的支持。 实际上&#xff0c;从12.1.2.0版本开始就支持WebSocket协议&#xff08;RFC 6455&#xff0…

【HBuilder】手机App推送至Apple App Store过程

一、前言 最近由于公司同事离职&#xff0c;顶替这位同事从事手机App的研发工作&#xff0c;BIM数据平台部门采用的是HBuilder作为手机App的制作环境。本篇介绍我是如何将HBuilder的Release包发布至App Store的。 二、内容 1. 首先登录Apple Developer网站 2. 点击iTunes Conn…

Java性能调优调查结果(第四部分)

这是系列文章中的最后一篇&#xff0c;我们将分析我们在2014年10月进行的Java Performance Tuning Survey的结果。如果您还没有阅读第一篇文章&#xff0c;我建议您首先阅读以下内容&#xff1a; 性能问题的频率和严重性 最受欢迎的监控解决方案 查找根本原因的工具和技术 …

android eclipse 配置 在项目右击选择properties

转载于:https://www.cnblogs.com/guoxiaoyue/p/3485243.html

减少主要GC暂停的频率

这篇文章将讨论一种技术&#xff0c;以减少应用程序等待时间造成的垃圾收集暂停的负担。 正如我几年前所写&#xff0c; 在JVM中无法禁用垃圾收集 。 但是&#xff0c;有一个巧妙的技巧可以用来大大减少长时间停顿的时间和频率。 如您所知&#xff0c;JVM中发生了两个不同的GC…

WAI-ARIA对自动完成小部件的支持

在本文中&#xff0c;我想讨论AutoComplete小部件的可访问性。 在您键入该字段时&#xff0c;通常会使用“自动完成”窗口小部件提供建议。 在当前的工作中&#xff0c;我基于Twitter的Typeahead &#xff08;一个灵活JavaScript库&#xff09;实现了JSF组件&#xff0c;该库为…

eclipse中java.lang.OutOfMemoryError: Java heap space错误

Myeclipse中报java.lang.OutOfMemoryError: Java heap space错误 解决办法: 选中被运行的类&#xff0c;点击菜单‘run->run Configuration’&#xff0c;选择(x)Argument标签页下的vm arguments框里 输入 -Xmx800m, 保存运行。问题解决 转载于:https://www.cnblogs.com/vig…

[Vue warn]: Invalid prop: custom validator check failed for prop xxx.问题

在用vue ui框架&#xff08;iview、elementui等&#xff09;做项目&#xff0c;会遇到这种问题 这样的&#xff0c;点那都报错&#xff0c;千辛万苦的付出&#xff0c;却找不到问题在哪 其实很简单&#xff0c;报错都显示出那个组件的问题了 ‘<Form>’这个组件&#xf…

CheckList 如何梳理可减少上线的验证时间(总结篇)

对CheckList的执行发起的思考&#xff1f; &#xff08;1&#xff09;功能越来越多&#xff0c;CheckList越补充越多&#xff0c;执行CheckList时间越来越长&#xff0c;如何减少上线的验证时间&#xff1f;&#xff08;2&#xff09;减少上线验证的时间外&#xff0c;如何保证…

PrimeFaces 5.0 DataTable列切换器

我有机会与PrimeFaces 5.0 DataTable一起工作&#xff0c;并且增强功能很棒。 今天&#xff0c;我只想展示其中的一项新功能……DataTable列切换器。 此功能使您可以通过复选框列表选择显示哪些列。 要使用列切换器&#xff0c;只需添加一个commandButton即可将列选择的选择列…

使用JGit API探索Git内部

您是否想过提交及​​其内容如何存储在Git中&#xff1f; 好吧&#xff0c;我有&#xff0c;在上一个下雨的周末&#xff0c;我有一些空闲时间&#xff0c;所以我做了一些研究。 因为我对Java的感觉比对Bash的感觉要多&#xff0c;所以我使用了JGit和一些学习测试来探索提交的…