基于XML的Web服务Java接口(JAX-WS)、Jakarta XML Web Services Eclipse 实现

2023-10-25 20:53

本文主要是介绍基于XML的Web服务Java接口(JAX-WS)、Jakarta XML Web Services Eclipse 实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

JAX-WS(Java API for XML-Based Web Services),是创建web服务的Java编程接口,特别是SOAP服务。是Java XML编程接口之一,是Java SE 和Java EE 平台的一部分。
JAX-WS 2.0 规范是代替JAX-RPC 1.0的下一代Web服务API。JAX-RPC(The Java API for XML Based RPC)是基于XML的RPC(远程过程调用)的Java API。
JAX-WS 2.0 使用JAXB(The Java Architecture for XML Binding)进行XML数据绑定,所谓绑定就是指XML请求和XML响应如何映射成java对象。

参考资源

JAX-WS 2.0参考资源

https://jcp.org/en/jsr/detail?id=224
在这里插入图片描述

https://jakarta.ee/specifications/xml-web-services/2.3/
在这里插入图片描述

JAX-WS 3.0参考资源

https://jakarta.ee/specifications/xml-web-services/3.0/
在这里插入图片描述

JAX-WS 4.0参考资源

https://jakarta.ee/specifications/xml-web-services/4.0/
在这里插入图片描述

Jakarta Web Services Metadata

Jakarta Web Services Metadata项目是Jakarta XML Web Services 项目的一部分,它用Java为web 服务定义了一个编程模型。

代码库:https://github.com/jakartaee/jws-api
在这里插入图片描述

Jakarta Web Services Metadata 3.0 Specification Document (HTML):
https://jakarta.ee/specifications/web-services-metadata/3.0/ws-metadata-spec-3.0

Jakarta Web Services Metadata 3.0 Javadoc:
https://jakarta.ee/specifications/web-services-metadata/3.0/apidocs/jakarta.jws/module-summary.html

参考实现

旧项目(已经归档、只读)

https://javaee.github.io/metro-jax-ws/
在这里插入图片描述

https://github.com/javaee/metro-jax-ws
在这里插入图片描述
在这里插入图片描述

新项目(Jakarta XML Web Services Eclipse 实现)

主页:
https://eclipse-ee4j.github.io/metro-jax-ws/
在这里插入图片描述

代码库:
https://github.com/eclipse-ee4j/metro-jax-ws
在这里插入图片描述
XML web服务的Eclipse 实现是一个web服务框架,它为最终用户和中间件开发者开发web服务解决方案提供了工具和基础设施(infrastructure)。
使用XML web服务的Eclipse 实现,客户端和web有一个大的优势:Java编程语言的平台无关性。

Jakarta XML Web Services Eclipse 实现需要的软件

  • Java SE 11或以后版本
  • Ant 1.10.6或以后版本
  • 在GlassFish v7.x 、Apache Tomcat 10.1.x下测试过

安装Jakarta XML Web Services Eclipse 实现

下载Jakarta XML Web Services Eclipse实现独立zip发布包

打开主页:https://eclipse-ee4j.github.io/metro-jax-ws/
在这里插入图片描述
点击右侧的Download就可以下载独立发布包,例如,下载jaxws-ri-4.0.0.zip。
解压后的目录:
在这里插入图片描述

bin子目录下的内容:
在这里插入图片描述

docs子目录下的内容:
在这里插入图片描述

lib子目录下的内容:
在这里插入图片描述

samples子目录下的内容:
在这里插入图片描述

安装到Tomcat中

设置CATALINA_HOME环境变量,指向Tomcat的安装目录,例如:
在这里插入图片描述
在这里插入图片描述
在cmd窗口,切换到Jakarta XML Web Services Eclipse实现解压后的目录,例如:D:\jaxws-ri-4.0.0\jaxws-ri
在这里插入图片描述

这个目录下有build.xml文件:
在这里插入图片描述

运行ant install命令。这个命令其实执行了两个大的操作:

  • 拷贝Jakarta XML Web Services Eclipse实现lib子目录下的jar文件到Tomcat安装目录下面的/shared/lib子目录中
  • 更新Tomcat安装目录下面/conf/catalina.properties文件中的属性shared.loader,使之等于${catalina.home}/shared/lib/*.jar

build.xml文件片段:

<target name="install" depends="update-catalina-props" description="Install XML-WS RI 4.0.0 jars"><echo message="Installing XML-WS RI 4.0.0 for ${catalina.home} ..."/><mkdir dir="${catalina.lib.home}"/><copy toDir="${catalina.lib.home}" overwrite="true"><fileset dir="${basedir}/lib" includes="*.jar"/></copy></target><target name="update-catalina-props"><echo message="Backing up ${catalina.home}/conf/catalina.properties..."/><copy file="${catalina.home}/conf/catalina.properties" tofile="${catalina.home}/conf/catalina.properties.backup"/><echo message="Adding XML-WS RI jars to shared.loader property in ${catalina.home}/conf/catalina.properties..."/><replace file="${catalina.home}/conf/catalina.properties" token="shared.loader=" value="shared.loader=$${catalina.home}/shared/lib/*.jar,"/>
</target>

执行ant install命令的窗口输出信息:
在这里插入图片描述

Jakarta XML Web Services Eclipse 实现依赖的jar包

https://eclipse-ee4j.github.io/metro-jax-ws/4.0.0/docs/release-documentation.html#jar-dependency
在这里插入图片描述

SOAP1.1+HTTP样例:运行fromjava样例(来自Jakarta XML Web Services Eclipse实现发布包)

说明

fromjava这个样例演示了从一个Java service endpoint的实现开始,如何构建、部署、调用一个简单的web服务。其中Java service endpoint的实现使用了Java注释。
在这里插入图片描述

fromjava的目录结构:
在这里插入图片描述

服务实现类只有一个方法addNumbers,输入两个整数,返回一个整数,抛出AddNumbersException异常:
在这里插入图片描述

运行web服务有两种方式:

  • 在servlet容器中运行
  • 作为一个j2se webservice endpoint运行(不需要servlet容器)

运行方式一:在tomcat容器中运行web服务

设置环境变量JAXWS_HOME指向JAX-WS的安装目录

在这里插入图片描述

在cmd窗口切换到fromjava的目录

在这里插入图片描述

运行ant clean

运行ant clean的作用是删掉${build.home}目录。其中${build.home}目录指向${basedir}/build,就是fromjava/build目录。(其实这个命令不运行也可以,因为下一步运行ant server命令的时候其中含有ant clean的步骤)
在这里插入图片描述

运行ant server -Dtomcat=true

运行ant server -Dtomcat=true的作用是构建、部署web服务的WAR包,因为要将web服务运行在tomcat中,所以加了-Dtomcat=true这个属性。这个命令做了四个工作:

<target name="server" depends="setup"><antcall target="clean"/><antcall target="build-server-java"/><antcall target="create-war"/><antcall target="deploy"/>
</target>

运行输出:
在这里插入图片描述
在这里插入图片描述

现在fromjava目录下的文件布局(注:照理${env.AS_HOME}这个目录不应该生成的,对我们没有什么用):

D:\JAXWS-RI-4.0.0\JAXWS-RI\SAMPLES\FROMJAVA
│  build.xml
│  Readme.txt
│  
├─${env.AS_HOME}
│  └─domains
│      └─domain1
│          └─autodeploy
│                  jaxws-fromjava.war
│                  
├─build
│  ├─classes
│  │  └─fromjava
│  │      └─server
│  │          │  AddNumbersException.class
│  │          │  AddNumbersImpl.class
│  │          │  AddWebservice.class
│  │          │  EndpointStopper$1.class
│  │          │  EndpointStopper.class
│  │          │  
│  │          └─jaxws
│  │                  AddNumbers.class
│  │                  AddNumbers.java
│  │                  AddNumbersExceptionBean.class
│  │                  AddNumbersExceptionBean.java
│  │                  AddNumbersResponse.class
│  │                  AddNumbersResponse.java
│  │                  
│  └─war
│          jaxws-fromjava.war
│          
├─etc
│      deploy-targets.xml
│      sun-jaxws.xml
│      web.xml
│      
└─src└─fromjava├─client│      AddNumbersClient.java│      └─serverAddNumbersException.javaAddNumbersImpl.javaAddWebservice.javaEndpointStopper.java

<tomcat安装目录>/webapps下查看,war包已经拷贝过来了:
在这里插入图片描述

运行tomcat

因为生成客户端代码的时候要访问web服务动态生成的wsdl文件,所以要先启动tomcat。
在这里插入图片描述
在这里插入图片描述

<tomcat安装目录>/webapps下查看,war包已经被自动部署了:
在这里插入图片描述

部署以后的文件布局:

D:\APACHE-TOMCAT-10.1.13\WEBAPPS\JAXWS-FROMJAVA
├─META-INF
│      MANIFEST.MF
│      war-tracker
│      
└─WEB-INF│  sun-jaxws.xml│  web.xml│  └─classes└─fromjava└─server│  AddNumbersException.class│  AddNumbersImpl.class│  AddWebservice.class│  EndpointStopper$1.class│  EndpointStopper.class│  └─jaxwsAddNumbers.classAddNumbers.javaAddNumbersExceptionBean.classAddNumbersExceptionBean.javaAddNumbersResponse.classAddNumbersResponse.java

看看wsdl文件能否正常生成

访问http://localhost:8080/jaxws-fromjava/addnumbers?wsdl
可以看到,正常生成了wsdl文件。生成客户端代码的时候,就要访问这个wsdl的地址。
在这里插入图片描述

<?xml version='1.0' encoding='UTF-8'?><!-- Published by XML-WS Runtime (https://github.com/eclipse-ee4j/metro-jax-ws). Runtime's version is XML-WS Runtime 4.0.0 git-revision#129f787. --><!-- Generated by XML-WS Runtime (https://github.com/eclipse-ee4j/metro-jax-ws). Runtime's version is XML-WS Runtime 4.0.0 git-revision#129f787. --><definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://server.fromjava/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://server.fromjava/" name="AddNumbersImplService">
<types>
<xsd:schema>
<xsd:import namespace="http://server.fromjava/" schemaLocation="http://localhost:8080/jaxws-fromjava/addnumbers?xsd=1"/>
</xsd:schema>
</types>
<message name="addNumbers">
<part name="parameters" element="tns:addNumbers"/>
</message>
<message name="addNumbersResponse">
<part name="parameters" element="tns:addNumbersResponse"/>
</message>
<message name="AddNumbersException">
<part name="fault" element="tns:AddNumbersException"/>
</message>
<portType name="AddNumbersImpl">
<operation name="addNumbers">
<input wsam:Action="http://server.fromjava/AddNumbersImpl/addNumbersRequest" message="tns:addNumbers"/>
<output wsam:Action="http://server.fromjava/AddNumbersImpl/addNumbersResponse" message="tns:addNumbersResponse"/>
<fault message="tns:AddNumbersException" name="AddNumbersException" wsam:Action="http://server.fromjava/AddNumbersImpl/addNumbers/Fault/AddNumbersException"/>
</operation>
</portType>
<binding name="AddNumbersImplPortBinding" type="tns:AddNumbersImpl">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="addNumbers">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
<fault name="AddNumbersException">
<soap:fault name="AddNumbersException" use="literal"/>
</fault>
</operation>
</binding>
<service name="AddNumbersImplService">
<port name="AddNumbersImplPort" binding="tns:AddNumbersImplPortBinding">
<soap:address location="http://localhost:8080/jaxws-fromjava/addnumbers"/>
</port>
</service>
</definitions>

运行ant clean

运行ant clean:
在这里插入图片描述

运行ant client

运行ant client的目的是为了生成客户端代码并编译:

<target name="generate-client" depends="setup"><wsimportdebug="true"verbose="${verbose}"keep="true"destdir="${build.classes.home}"package="fromjava.client"wsdl="http://localhost:8080/jaxws-fromjava/addnumbers?wsdl"></wsimport>
</target><target name="client" depends="generate-client"><javacfork="true"srcdir="${basedir}/src"destdir="${build.classes.home}"includes="**/client/**,**/common/**"><classpath refid="jaxws.classpath"/></javac>
</target>

在这里插入图片描述

运行后,客户端代码布局:

D:\JAXWS-RI-4.0.0\JAXWS-RI\SAMPLES\FROMJAVA\BUILD
├─classes
│  └─fromjava
│      └─client
│              AddNumbers.class
│              AddNumbers.java
│              AddNumbersClient.class
│              AddNumbersException.class
│              AddNumbersException.java
│              AddNumbersException_Exception.class
│              AddNumbersException_Exception.java
│              AddNumbersImpl.class
│              AddNumbersImpl.java
│              AddNumbersImplService.class
│              AddNumbersImplService.java
│              AddNumbersResponse.class
│              AddNumbersResponse.java
│              ObjectFactory.class
│              ObjectFactory.java
│              package-info.class
│              package-info.java
│              
└─war

运行ant run

执行ant run表示运行客户端。

<target name="run"><java fork="true" classname="fromjava.client.AddNumbersClient"><classpath><path refid="jaxws.classpath"/><pathelement location="${build.classes.home}"/><pathelement location="${basedir}/etc"/></classpath></java>
</target>

在这里插入图片描述

运行方式二:作为一个j2se webservice endpoint运行(不运行在servlet容器中)

运行ant clean server-j2se

运行ant clean server-j2se生成服务端代码,并且用Endpoint API来部署:

<target name="server-j2se" depends="setup"><antcall target="clean"/><antcall target="build-server-java"/><echo message="Starting endpoint... To stop: ant server-j2se-stop "/><java fork="true" classname="fromjava.server.AddWebservice"><classpath><path refid="jaxws.classpath"/><pathelement location="${build.classes.home}"/></classpath></java>
</target>

在这里插入图片描述

生成的文件布局:

D:\JAXWS-RI-4.0.0\JAXWS-RI\SAMPLES\FROMJAVA\BUILD
├─classes
│  └─fromjava
│      └─server
│          │  AddNumbersException.class
│          │  AddNumbersImpl.class
│          │  AddWebservice.class
│          │  EndpointStopper$1.class
│          │  EndpointStopper.class
│          │  
│          └─jaxws
│                  AddNumbers.class
│                  AddNumbers.java
│                  AddNumbersExceptionBean.class
│                  AddNumbersExceptionBean.java
│                  AddNumbersResponse.class
│                  AddNumbersResponse.java
│                  
└─war

访问http://localhost:8080/jaxws-fromjava/addnumbers?wsdl
可以正常生成wsdl文件:

在这里插入图片描述

运行ant clean client run

另外打开一个cmd窗口,运行ant clean client run,目的是在根据endpoint发布的wsdl文件生成客户端代码、编译、并且运行。
在这里插入图片描述
在这里插入图片描述

运行后,客户端的代码布局:
D:\JAXWS-RI-4.0.0\JAXWS-RI\SAMPLES\FROMJAVA\BUILD
├─classes
│ └─fromjava
│ └─client
│ AddNumbers.class
│ AddNumbers.java
│ AddNumbersClient.class
│ AddNumbersException.class
│ AddNumbersException.java
│ AddNumbersException_Exception.class
│ AddNumbersException_Exception.java
│ AddNumbersImpl.class
│ AddNumbersImpl.java
│ AddNumbersImplService.class
│ AddNumbersImplService.java
│ AddNumbersResponse.class
│ AddNumbersResponse.java
│ ObjectFactory.class
│ ObjectFactory.java
│ package-info.class
│ package-info.java

└─war

运行ant server-j2se-stop,停止web服务

<target name="server-j2se-stop" depends="setup"><get src="http://localhost:9090/stop" dest="stop.status"/>
</target>

在这里插入图片描述

Jakarta XML Web Services Eclipse实现下载方式二:用maven下载

在maven工程的pom.xml文件中增加如下依赖:

  <dependencies><dependency><groupId>jakarta.xml.ws</groupId><artifactId>jakarta.xml.ws-api</artifactId><version>4.0.0</version></dependency><dependency><groupId>com.sun.xml.ws</groupId><artifactId>jaxws-rt</artifactId><version>4.0.0</version>        </dependency></dependencies>

这篇关于基于XML的Web服务Java接口(JAX-WS)、Jakarta XML Web Services Eclipse 实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/285137

相关文章

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

JVisualVM之Java性能监控与调优利器详解

《JVisualVM之Java性能监控与调优利器详解》本文将详细介绍JVisualVM的使用方法,并结合实际案例展示如何利用它进行性能调优,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1. JVisualVM简介2. JVisualVM的安装与启动2.1 启动JVisualVM2

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

Java如何从Redis中批量读取数据

《Java如何从Redis中批量读取数据》:本文主要介绍Java如何从Redis中批量读取数据的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一.背景概述二.分析与实现三.发现问题与屡次改进3.1.QPS过高而且波动很大3.2.程序中断,抛异常3.3.内存消

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获