让我们编写一个文档样式的Web服务

您可能知道,我们可以使用四种主要的Web服务样式。 它们如下:

  • 文件/文学
  • 包装的文件/文学
  • RPC /编码
  • RPC /文字

当然,现在不建议使用RPC /编码样式。 如果您有兴趣,可以在此处找到这篇非常全面的文章,以了解不同的Web服务样式及其优点。

今天,我们将看到如何编写一种Web服务的Document / Literal包装器。 该职位的议程如下:

  • 根据包装的文档/文字编写一个简单的Web服务
  • 如何在tomcat Web容器上托管简单的Web服务
  • 一个简单的测试客户即可测试我们的服务

因此,让我们开始旅程:

  • 根据包装的文档/文字编写一个简单的Web服务
package com.wsbindings;import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.soap.SOAPBinding.Use;@WebService
@SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL, parameterStyle = ParameterStyle.WRAPPED)
public interface AddService {@WebMethodpublic int addIntegers(@WebParam(name = "intOne") int paramOne,@WebParam(name = "intTwo") int paramTwo);
}

这是我们的基本Web服务。 这是我们服务的基本接口。 如您所见,我们首先使用@ javax.jws.WebService对其进行注释,以指示其将要编写的Web服务。 接下来是我们定义SOAPBinding的有趣部分。 在这里,我们声明要编写一个DOCUMENT样式的Web服务,该服务是LITERAL形式,也是WRAPPED样式。 这里要注意的一件事是,Soap Binding批注中指定的所有三个属性值都是默认值,因此您可以不必在此处明确声明而无需使用它们。 我这样做是为了使本文清晰。

继续,让我们看看该特定接口的实现如何:

package com.wsbindings;import javax.jws.WebService;@WebService(endpointInterface="com.wsbindings.AddService")
public class AddServiceImpl implements AddService{public int addIntegers(int paramOne, int paramTwo) {return paramOne+paramTwo;}}

在此服务的功能方面,这里同样没有什么壮观的。 只需将传入的两个数字相加,然后发回相加结果。 请注意,在这里我们再次必须使用@WebService批注对实现类进行批注。 现在,我们已经完成了编写Web服务合同和实现的初始部分,让我们看看如何将其托管在tomcat Web容器上。

  • 如何在tomcat Web容器上托管简单的Web服务

如您所知,默认情况下,tomcat不带有JAX-WS实现,这与典型的应用程序服务器(例如JBoss,Glassfish)不同。 因此,要使其正常工作,您需要获得JAX-WS规范的实现。 在这种情况下,我们将使用Metro 。 您可以将jar文件从下载文件复制到WEB-INF / lib目录,也可以使用Maven为您完成,这就是我将在本文中做的。 因此,为了获得与Metro实施相关的require jar文件,我将以下依赖项添加到pom中:

<dependency><groupId>com.sun.xml.ws</groupId><artifactId>jaxws-rt</artifactId><version>2.1.3</version><exclusions><exclusion><groupId>com.sun.xml.stream</groupId><artifactId>sjsxp</artifactId></exclusion></exclusions></dependency>

请注意,我在这里为sjsxp工件添加了一个排除项,因为我需要的是比从传递依赖中绘制的版本更高的版本。 否则,您将获得以下异常。

无法初始化类javax.xml.stream.XMLStreamException:编码UTF-8的底层流和writeStartDocument()方法utf-8的输入参数不匹配。

为了解决此问题,我需要在pom中添加以下依赖项:

<dependency><groupId>com.sun.xml.stream</groupId><artifactId>sjsxp</artifactId><version>1.0.1</version></dependency>

多亏了这个线程,我才能够找到这个解决方案。

继续,我们需要定义一个特定的xml文件,该文件应放在名为sun-jaxws.xml的WEB-INF目录 。 该XML指定了我们如何访问Web服务以及在何处找到实现类。 让我们看一下该文件的内容:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"><endpointname="AddWS"implementation="com.wsbindings.AddServiceImpl"url-pattern="/addws"/>
</endpoints>

在这里,我们提供了Web服务实现类所驻留的包以及有关如何访问特定Web服务的URL模式。 我们要做的最后一件事是将以下内容添加到我们的web.xml中,以便成功托管我们的Web服务:

<listener><listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class></listener><servlet><servlet-name>AddWS</servlet-name><servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class></servlet><servlet-mapping><servlet-name>AddWS</servlet-name><url-pattern>/addws</url-pattern></servlet-mapping>

注意,我们必须定义一个上下文侦听器和一个Servlet类,它们将处理我们的Web服务调用。 如果查看WSServletContextListner的源代码,将看到它从WEB-INF目录读取sun-jaxws.xml文件,并相应地为Web服务上下文创建类加载器。 关于文档样式Web服务的一件事是,您需要为请求和响应生成一些代码。 如果不这样做,则会出现以下错误,并显示以下消息:

您是否运行过APT来生成它们?

您可以使用JDK安装附带的wsgen工具生成所需的类。 您还可以使用Apache-CXF为您生成这些类。 我们将通过提供给我们的apache-cxf maven插件来使用后一种方法。 将以下内容包括到您的pom和您的物品中;

<plugin><groupId>org.apache.cxf</groupId><artifactId>cxf-codegen-plugin</artifactId><version>2.0.9</version><dependencies><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>2.0.9</version></dependency></dependencies><executions><execution><id>generate-wsdl</id><phase>process-classes</phase><configuration><className>com.wsbindings.AddServiceImpl</className><argline>-classdir ${project.build.directory}/classes</argline></configuration><goals><goal>java2wsdl</goal></goals></execution></executions></plugin>

在这里,我们使用java2wsdl命令为我们的Web服务生成所需的请求和响应对象。 如您所见,我已经使用<argline>属性指定我希望生成的类进入的位置。 由于在构建war文件时运行的常规maven编译任务将在classes目录中查找,因此我也将我们的类指定为包含在同一路径中,以便在war时将它们与我们的Web服务类捆绑在一起被建造。 通过查看此处指定的参数,您可以看到所有可能发出的命令。

当我包含我的apache-cxf maven插件时,我的pom指示错误,如下所示:
生命周期配置未涵盖插件执行
经过对该问题的研究后,我偶然发现了此处所述的解决方案。因此,要解决此问题,您必须在pom的<build>标记下包含以下代码段:

<pluginManagement><plugins><!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. --><plugin><groupId>org.eclipse.m2e</groupId><artifactId>lifecycle-mapping</artifactId><version>1.0.0</version><configuration><lifecycleMappingMetadata><pluginExecutions><pluginExecution><pluginExecutionFilter><groupId>org.apache.cxf</groupId><artifactId>cxf-codegen-plugin</artifactId><version>2.0.9</version><goals><goal>test-compile</goal><goal>compile</goal></goals></pluginExecutionFilter><action><execute /></action></pluginExecution></pluginExecutions></lifecycleMappingMetadata></configuration></plugin></plugins></pluginManagement>

那应该为您摆脱那个错误,尽管我不能给您确切的原因来说明为什么出现该警告。 如果您知道确切的原因,请您为我们大家的利益发表评论。 之后,您只需生成war文件并将其复制到tomcat的webapps目录即可。 然后,您将可以通过以下路径访问Web服务:
http:// localhost:8080 / ws-bindings / addws
我将tomcat托管在其上的端口是8080,而ws-bindings是我的war文件的名称。

最后,让我们看看如何生成服务所需的客户端存根,然后编写一个小型客户端来测试我们的Web服务。

  • 一个简单的测试客户即可测试我们的服务

我们将再次使用apache-cxf maven插件通过wsdl2java命令生成客户端存根。 请注意,首先我们需要从托管我们的Web服务的路径获取wsdl。 它将位于;

http://localhost:8080/ws-bindings/addws?wsdl

然后,我将内容复制到单独的xml文件中,并将其保存在我创建的用于生成客户端存根的单独的maven项目的资源目录下。 然后,您需要做的就是添加生成pom中的存根所需的配置,如下所示;

<plugin><groupId>org.apache.cxf</groupId><artifactId>cxf-codegen-plugin</artifactId><version>2.0.9</version><executions><execution><id>generate-sources</id><phase>generate-sources</phase><configuration><wsdlOptions><wsdlOption><wsdl>${project.basedir}/src/main/resources/AddService.wsdl</wsdl></wsdlOption></wsdlOptions></configuration><goals><goal>wsdl2java</goal></goals></execution></executions></plugin>

这将为您生成测试Web服务所需的存根。 最后,让我们编写一个客户端以使用生成的存根访问我们的Web服务。

import java.net.MalformedURLException;
import java.net.URL;import javax.xml.namespace.QName;
import javax.xml.ws.Service;import com.wsbindings.AddService;public class DocWrapperClient {public static void main(String[] args) throws MalformedURLException {URL wsdlLocation = new URL("http://localhost:8080/ws-bindings/addws?wsdl");  QName qName = new QName("http://wsbindings.com/", "AddServiceImplService");  Service service = null;  service = Service.create(wsdlLocation, qName);  AddService ser = service.getPort(AddService.class);System.out.println(ser.addIntegers(1, 1));}
}

就是这样,我希望您觉得内容有用。 您可以从此处下载与服务器相关的maven项目,并从此处下载客户端存根生成maven项目,以查看示例。

参考: 让我们在“ 我的旅程” IT博客中,从JCG合作伙伴 Dinuka Arseculeratne 编写文档样式的Web服务 。

翻译自: https://www.javacodegeeks.com/2013/04/let-us-write-a-document-style-web-service.html

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

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

相关文章

linux 进入容器,查看和关闭进程

1&#xff0c;linux 查询容器 ID&#xff1a; docker ps 2&#xff0c;进入容器&#xff08;退出 exec 命令用&#xff1a;[ctrlD] &#xff0c;不会终止容器运行。退出 top 命令&#xff1a;ctrl C&#xff09; docker exec -it c39c9d3898c0 /bin/bash 3&#xff0c;查询进程…

mysql表单查询_MySQL表单集合查询

表单查询简单查询SELECT语句查询所有字段指定所有字段&#xff1a;select 字段名1,字段名2&#xff0c;...from 表名;select * from 表名;查询指定字段select 字段名1,字段名2&#xff0c;...from 表名;按条件查询带关系运算符的查询SELECT 字段名1,字段名2,……FROM 表名WHERE…

解决阿里云OSS跨域问题

解决阿里云OSS跨域问题 现象 本人项目中对阿里云图片请求进行了两次&#xff0c;第一次通过img标签进行&#xff0c;第二次通过异步加载获取。第一次请求到图片&#xff0c;浏览器会进行缓存&#xff0c;随后再进行异步请求&#xff0c;保存跨域失效。 错误信息如下&#xff1a…

css之hover改变子元素和其他元素样式

参考地址&#xff1a;链接 表示下一级元素&#xff0c;>表示子元素 1 <!DOCTYPE html>2 <html>3 <head lang"en">4 <meta charset"UTF-8">5 <title></title>6 </head>7 8 <style>9 #a {co…

将JacpFX客户端与JSR 356 WebSockets一起使用

JSR 356 WebSockets是即将发布的JEE 7版本中令人兴奋的新功能之一&#xff0c;并且在其参考实现中包括Server-和Client API。 这使其非常适合在客户端与JavaFX集成。 JacpFX是JavaFX之上的RCP框架&#xff0c;它使用基于消息的方法与组件进行交互。 这种基于消息的方法使集成We…

nagios check_mysql uptime_nagios使用check_mysql监控mysql

如果没有check_mysql插件&#xff0c;需要安装Mysql数据库1、建立专用数据库&#xff1a; [rootsvr3 ~]#mysql -u root -pEnter password:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 51910Server version: 5.5.3-m3-log Source di…

《精通Spring4.X企业应用开发实战》读后感第七章(AOP概念)

转载于:https://www.cnblogs.com/Michael2397/p/8068486.html

XHTML与HTML的区别

XHTML的语法较为严谨&#xff0c;拥有一定的规则&#xff0c;如果不遵循规则的话容易出错。但也不必太过担心&#xff0c;因为XHTML的规则并不太难&#xff0c;它和HTML4.01标准没有太多的不同。 需要注意的是以下几点&#xff1a; 1.XHTML标签必须被正确的关闭&#xff0c;即…

EC2上的ElasticSearch不到60秒

好奇地看到所有ElasticSearch轮奸是关于什么的&#xff1f; 想在没有大量肘部油脂的情况下看到它吗&#xff1f; 然后&#xff0c;朋友&#xff0c; 别再犹豫了-不到60秒&#xff0c;我将向您展示如何在AWS AMI上安装ElasticSearch 。 您首先需要一个AWS账户以及一个SSH密钥对…

Material使用04 MdCardModule和MdButtonModule综合运用

设计需求&#xff1a;设计一个登陆页面 1 模块导入 1.1 将MdCardModule和MdButtonModule模块导入到共享模块中 import { NgModule } from angular/core; import { CommonModule } from angular/common; import { MdSidenavModule, MdToolbarModule,MdIconModule,MdButtonModule…

mysql子分区多少层_MYSQL子分区修剪

我有一个MYSQL表与分区的年份和子分区的月份。MYSQL子分区修剪CREATE TABLE ptable (id INT NOT NULL AUTO_INCREMENT,name varchar(100),purchased DATETIME NOT NULL,PRIMARY KEY (id, purchased))PARTITION BY RANGE(YEAR(purchased))SUBPARTITION BY HASH(MONTH(purchased)…

65. Valid Number

Validate if a given string is numeric. Some examples:"0" > true" 0.1 " > true"abc" > false"1 a" > false"2e10" > true 判断字符串是否代表了有效数字。 这道题有点坑&#xff0c;情况比较多…… 1 cl…

python实现bp神经网络对csv文件进行数据预测

参考资源&#xff1a; sklearn库 bp神经网络[从原理到代码一篇搞定]&#xff08;2&#xff09;_sklearn 神经网络-CSDN博客 十分钟上手sklearn&#xff1a;安装&#xff0c;获取数据&#xff0c;数据预处理 - 知乎 (zhihu.com) 一个实例讲解如何使用BP神经网络(附代码) - 知…

html实现 页面禁止右键 禁止复制 禁止图片拖动 禁止复制和剪切

众所周知&#xff0c;一般的屏蔽的方法是用JS来编写的脚本&#xff0c;但是也可以直接通过修改网页属性的方法来屏蔽右键 禁止复制。 禁止右键 οncοntextmenu"return false" 禁止复制和剪切&#xff1a; οncοpy"return false;" oncut"return fa…

Spring MVC:表单处理卷。 4 –单选按钮

在软件开发领域&#xff0c;单选按钮是图形用户界面的重要组成部分。 Spring MVC标签库为此表单元素提供了特殊标签。 更确切地说&#xff0c;有两个标签用于此目的&#xff1a;单选按钮&#xff0c;单选按钮。 两者对于特定任务都是有用的。 如您所知&#xff0c;我将在帖子中…

点击时候确定某个元素 js_某空气质量监测平台 JS反爬

目标&#xff1a;中国空气质量在线监测分析平台|城市分析 参考CSDN中文章&#xff0c;记录一下学习过程通过切换城市&#xff0c;页面数据是通过 Ajax 加载的&#xff0c;数据接口&#xff1a;https://www.aqistudy.cn/apinew/aqistudyapi.php请求的POST Data、返回的数据都被加…

HTML 部分常用属性、组成属性|...超链接、路径、锚点、列表、滚动、URL编码、表格、表单、GET和POST

URL地址 就是我们所说的网址&#xff1a;www.jd.com 浏览器内核&#xff0c;渲染引擎 Ie内核&#xff1a;triteent 谷歌/欧鹏&#xff1a;blink 火狐&#xff1a;gecko 苹果&#xff1a;webkit 渲染引擎是出现兼容性的根本问题 -html概念:hyper Text Markup Languag…

Spring @Value取值为null或@Autowired注入失败

Value 用于注入.properties文件中定义的内容 Autowired 用于装配bean 用法都很简单&#xff0c;很直接&#xff0c;但是稍不注意就会出错。下面就来说说我遇到的问题。 前两天在项目中遇到了一个问题&#xff0c;大致描述就是我写了如下一个类&#xff08;只列出关键代码&#…

2个域名重定向到https域名

配置实例&#xff1a; [rootiZbp17q09o7e8pgg9dybd7Z conf.d]# cat company.confserver { listen 80; server_name www.yu*******dao.com www.bj******kd.com; if ($host ! www.yu********dao.com) { rewrite ^/(.*)$ http://www.yu**********dao.com/$1 permanent; } return …

mysql 部门表_MySQL高级

本文大纲环境win10-64MySQL Community Server 5.7.1mysqld –version可查看版本官方文档SQL执行顺序手写顺序我们可以将手写SQL时遵循的格式归结如下&#xff1a;select distinct from join on wheregroup byhavingorder bylimit <offset>,<rows>distinct&…