代码示例:基于JAX-WS和JAXB,其中http请求和响应的报文体都是xml数据

说明

基于JAX-WS编写了RESTful的web服务端点。
http请求和响应的报文体都是xml数据,服务端分别对应了用JAXB注解的请求和响应类。
只实现了服务端的代码示例
客户端使用了Postman

示例

要实现的目标:http请求和响应报文体的xml数据

http请求报文体的xml数据:

<?xml version="1.0" encoding="UTF-8"?>
<request><reqtype>01</reqtype><secret>test</secret><body>0858032316</body>
</request>

http响应报文体的xml数据:

<?xml version='1.0' encoding='UTF-8'?>
<response><body>15</body><flag>1</flag>
</response>

代码实现

maven工程增加依赖

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

<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>

RESTful的web服务端点实现

package com.thb.server.register;import com.sun.xml.ws.util.xml.StAXSource;import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Marshaller;
import jakarta.xml.bind.Unmarshaller;
import jakarta.xml.ws.BindingType;
import jakarta.xml.ws.Provider;
import jakarta.xml.ws.WebServiceProvider;
import jakarta.xml.ws.http.HTTPBinding;
import jakarta.xml.ws.http.HTTPException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;@WebServiceProvider
@BindingType(value=HTTPBinding.HTTP_BINDING)
public class Register implements Provider<Source> {public Source invoke(Source source) {try {return process(source);} catch(Exception e) {e.printStackTrace();throw new HTTPException(500);}}private Source process(Source source) throws JAXBException { // 传入的是xml数据时,此处source是com.sun.xml.ws.util.xml.StAXSourceSystem.out.println(source.getClass().getName());//注意,此处的StAXSource是com.sun.xml.ws.util.xml.StAXSource// 而不是javax.xml.transform.stax.StAXSourceif (source instanceof StAXSource) {// 参数中填写用JAXB注解的请求和响应类,它们分别对应请求的xml和响应的xmlJAXBContext context = JAXBContext.newInstance(RegisterResponse.class,RegisterRequest.class);// 下面代码将收到的请求中的xml数据反序列化为Java对象// 创建一个Unmarshaller,反序列化使用Unmarshaller unmarshaller = context.createUnmarshaller();// 将接收到的xml数据反序列到java对象Object object = unmarshaller.unmarshal(source);// 打印出来反序列化后的Java对象的类型,是com.thb.server.register.RegisterRequestSystem.out.println(object.getClass().getName());// 将反序列化后的Java对象转换为RegisterRequest对象,RegisterRequest使用了JAXB注解RegisterRequest registerRequest = (RegisterRequest)object;// 将反序列化以后的Java对象的属性打印出来,看是否符合预期System.out.println("functionCode: " + registerRequest.getFunctionCode());System.out.println("enterpriseAccount: " + registerRequest.getEnterpriseAccount());System.out.println("secret: " + registerRequest.getSecret());// 下面代码将Java对象序列化为xml数据// 创建一个Marshaller,序列化使用Marshaller marshaller = context.createMarshaller();// 设置序列化后的xml的编码类型。此处不设置也可以marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 创建一个输出输出流ByteArrayOutputStream  outputStream = new ByteArrayOutputStream();// 创建响应的java对象,并设置对象的属性,该对象使用了JAXB注解RegisterResponse registerResponse = new RegisterResponse();registerResponse.setFlag(1);registerResponse.setEnterpriseId("15");// 将Java对象序列到输出流marshaller.marshal(registerResponse, outputStream);// 取输出流中的字节byte[] bytes = outputStream.toByteArray();// 构造输入流ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);// 用输入流构造StreamSourcereturn new StreamSource(inputStream);} else {return null;}}}

http请求xml对应的java对象,使用了JAXB注解

package com.thb.server.register;import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;/*** 该类映射到http请求的xml* @author thb**/
// 使用了JAXB注解,映射到xml中的request元素
@XmlRootElement(name = "request")
public class RegisterRequest {private int functionCode;private String secret;private String enterpriseAccount;// 使用了JAXB注解,映射到xml中的reqtype元素@XmlElement(name="reqtype")public int getFunctionCode() {return this.functionCode;}// 此处的setter函数要有,否则从xml反序列到java对象的时候无法赋值public void setFunctionCode(int functionCode) {this.functionCode = functionCode;}// 使用了JAXB注解,映射到xml中的secret元素@XmlElement(name="secret")public String getSecret() {return this.secret;}// 此处的setter函数要有,否则从xml反序列到java对象的时候无法赋值public void setSecret(String secret) {this.secret = secret;}// 使用了JAXB注解,映射到xml中的body元素@XmlElement(name = "body")public String getEnterpriseAccount() {return this.enterpriseAccount;}// 此处的setter函数要有,否则从xml反序列到java对象的时候无法赋值public void setEnterpriseAccount(String enterpriseAccount) {this.enterpriseAccount = enterpriseAccount;}
}

http响应xml对应的java对象,使用了JAXB注解

package com.thb.server.register;import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;/*** 该类映射到http响应的xml* @author thb**/
//使用了JAXB注解,映射到xml中的response元素
@XmlRootElement(name = "response")
public class RegisterResponse {private int flag;private String enterpriseId;public RegisterResponse() {}//使用了JAXB注解,映射到xml中的flag元素@XmlElement(name = "flag")public int getFlag() {return this.flag;}public void setFlag(int flag) {this.flag = flag;}//使用了JAXB注解,映射到xml中的body元素@XmlElement(name = "body")public String getEnterpriseId() {return this.enterpriseId;}public void setEnterpriseId(String enterpriseId) {this.enterpriseId = enterpriseId;}}

web应用的web.xml文件

<?xml version="1.0" encoding="UTF-8"?><web-app version="6.0" xmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"><description>power-restful</description><display-name>power-restful</display-name><listener><listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class></listener><servlet><description>The JAX-WS dispatcher servlet</description><display-name>dispatcher</display-name><servlet-name>dispatcher</servlet-name><servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/register/*</url-pattern></servlet-mapping><session-config><session-timeout>60</session-timeout></session-config>
</web-app>

sun-jaxws.xml文件

<?xml version="1.0" encoding="UTF-8"?><endpointsxmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"version="2.0"><endpointname="restful-register"implementation="com.thb.server.register.Register"url-pattern="/register/*" />
</endpoints>

web应用部署到tomcat的目录布局

D:\APACHE-TOMCAT-10.1.13\WEBAPPS\POWER-RESTFUL
├─META-INF
│      MANIFEST.MF
│      war-tracker
│      
└─WEB-INF│  sun-jaxws.xml│  web.xml│  ├─classes│  └─com│      └─thb│          └─server│              └─register│                      Register.class│                      RegisterRequest.class│                      RegisterResponse.class│                      └─libangus-activation-1.0.0.jarangus-mail-1.0.0.jarFastInfoset-2.1.0.jargmbal-api-only-4.0.3.jarha-api-3.1.13.jarjakarta.activation-api-2.1.0.jarjakarta.annotation-api-2.1.1.jarjakarta.mail-api-2.1.0.jarjakarta.xml.bind-api-4.0.0.jarjakarta.xml.soap-api-3.0.0.jarjakarta.xml.ws-api-4.0.0.jarjaxb-core-4.0.0.jarjaxb-impl-4.0.0.jarjaxws-rt-4.0.0.jarlog4j-api-2.20.0.jarlog4j-core-2.20.0.jarmanagement-api-3.2.3.jarmimepull-1.10.0.jarsaaj-impl-3.0.0.jarstax-ex-2.1.0.jarstax2-api-4.2.1.jarstreambuffer-2.1.0.jarwoodstox-core-6.2.8.jar

用Postman发送请求、收到的响应

在这里插入图片描述

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

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

相关文章

快速提高编码生产力——中国用户如何使用Jetbrains内置的AI助手

文章目录 安装AI助手插件怎么在国内使用特殊工具先安排上系统设置代理IDE设置代理 使用案例 安装AI助手插件 此功能依赖于AI Assistant插件&#xff0c;您需要安装并启用该插件。 按打开 IDE 设置&#xff0c;然后选择插件。CtrlAltS打开Marketplace选项卡&#xff0c;找到AI…

Spring 如何自己创建一个IOC 容器

IOC(Inversion of Control),意思是控制反转&#xff0c;不是什么技术&#xff0c;而是一种设计思想&#xff0c;IOC意味着将你设计好的对象交给容器控制&#xff0c;而不是传统的在你的对象内部直接控制。 在传统的程序设计中&#xff0c;我们直接在对象内部通过new进行对象创建…

Swift 如何打造兼容新老系统的字符串分割(split)方法

0. 概览 在 Swift 的开发中&#xff0c;我们经常要与字符串打交道。其中一个常见的操作就是用特定的“分隔符”来分割字符串&#xff0c;这里分隔符可能不仅仅是字符&#xff0c;而是多字符组成的字符串。 从 iOS 16 开始&#xff0c; 新增了对应的方法来专注此事。不过&am…

zabbix的安装配置,邮件告警,钉钉告警

zabbix监控架构 zabbix优点 开源&#xff0c;无软件成本投入server对设备性能要求低支持设备多&#xff0c;自带多种监控模板支持分布式集中管理&#xff0c;有自动发现功能&#xff0c;可以实现自动化监控开放式接口&#xff0c;扩展性强&#xff0c;插件编写容易当监控的item…

Git详解及 github使用

1.1 关于版本控制 开始之前先看一个没有版本控制的例子 1.1.1 本地版本控制 本地版本控制系统 许多人习惯用复制整个项目目录的方式来保存不同的版本&#xff0c;或许还会改名加上备份时间以示区别。这么做唯一的 好处就是简单&#xff0c;但是特别容易犯错。有时候会混淆所在…

深度学习交通车辆流量分析 - 目标检测与跟踪 - python opencv 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 DeepSORT车辆跟踪3.1 Deep SORT多目标跟踪算法3.2 算法流程 4 YOLOV5算法4.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

mysql客户端navicat的一些错误合集

关于mysql的客户端的使用的一些问题 问题描述&#xff1a; 在使用navicat prenium客户端的时候&#xff0c;连接数据库出现 Table ‘performance_schema.session_variables’ doesn’t exist 错误 解决方案&#xff1a; 首先找到mysql的bin目录 然后winR 进入到cmd界面 输入…

AST系列文章|根据节点前后的变化来写代码

关注它&#xff0c;不迷路。 本文章中所有内容仅供学习交流&#xff0c;不可用于任何商业用途和非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请联系作者立即删除&#xff01; 需求 本文以一个简短的混淆js代码来讲解如何根据节点前后的变化来写代…

基于单片机音乐弹奏播放DS1302万年历显示及源程序

一、系统方案 1、本设计采用51单片机作为主控器。 2、DS1302计时显示年月日时分秒。 3、按键可以弹奏以及播放音乐&#xff0c;内置16首音乐。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 /时钟显示**/ void init_1602_ds1302() { write…

市级奖项+1,持安获「创业北京」创业创新大赛优秀奖!

2274个创业项目参赛 历经五个多月的激烈角逐 第六届“创业北京”创业创新大赛 终于圆满落下帷幕 持安科技在北京市总决赛中再创佳绩&#xff01; 荣获制造业赛道优秀奖 本次大赛由北京市人力资源和社会保障局、北京市发展和改革委员会等11家单位联合主办&#xff0c;以“创…

初识MongoDB及安装

文章目录 一、MongoDB核心概念1、库2、集合3、文档4、关系总结 二、MongoDB的安装总结 一、MongoDB核心概念 1、库 mongodb中的库就类似于传统关系型数据库中库的概念&#xff0c;用来通过不同库隔离不同应用数据。mongodb中可以建立多个数据库。每一个库都有自己的集合和权限…

C++项目案例圆和点的关系 (涉及知识点:头文件定义类,cpp文件实现类,类和作用域,linux编译运行c++项目)

一.项目描述 点与圆有三种关系&#xff1a; 点在圆外 点在圆上 点在圆内计算点到圆心的距离就能判断点在圆的哪个地方。二.项目结构 三.include文件 3.1 Circle类的声明 Circle.h // 防止头文件重复包含 #pragma once // #include<iostream> #include "Point.h&…