代码示例:基于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.StAXSource
        System.out.println(source.getClass().getName());

        //注意,此处的StAXSource是com.sun.xml.ws.util.xml.StAXSource
        // 而不是javax.xml.transform.stax.StAXSource
        if (source instanceof StAXSource) {
            // 参数中填写用JAXB注解的请求和响应类,它们分别对应请求的xml和响应的xml
            JAXBContext 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.RegisterRequest
            System.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);
            // 用输入流构造StreamSource
            return 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"?>

<endpoints
    xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
    version="2.0">

    <endpoint
        name="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
    │                      
    └─lib
            angus-activation-1.0.0.jar
            angus-mail-1.0.0.jar
            FastInfoset-2.1.0.jar
            gmbal-api-only-4.0.3.jar
            ha-api-3.1.13.jar
            jakarta.activation-api-2.1.0.jar
            jakarta.annotation-api-2.1.1.jar
            jakarta.mail-api-2.1.0.jar
            jakarta.xml.bind-api-4.0.0.jar
            jakarta.xml.soap-api-3.0.0.jar
            jakarta.xml.ws-api-4.0.0.jar
            jaxb-core-4.0.0.jar
            jaxb-impl-4.0.0.jar
            jaxws-rt-4.0.0.jar
            log4j-api-2.20.0.jar
            log4j-core-2.20.0.jar
            management-api-3.2.3.jar
            mimepull-1.10.0.jar
            saaj-impl-3.0.0.jar
            stax-ex-2.1.0.jar
            stax2-api-4.2.1.jar
            streambuffer-2.1.0.jar
            woodstox-core-6.2.8.jar

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c语言免杀火绒

文章目录 前记c加载器补充知识 前记 pyinstaller pyinstaller目前已经被杀疯了&#xff0c;简单打包一个hello a"hello" print(a)#pyinstaller -F -w b.py -n HipsMain.exe考虑Nuitka pip uninstall nuitka pip install nuitka pip install nuitka1.8.5 这里最新…

【2】SM2验签工具和RSA验签工具

0X01 前言 最近看了好多验签工具&#xff0c;感觉不是很好用&#xff0c;就自己造了个。 0x02 工具功能介绍 对SM2算法进行验签和RSA算分进行验签&#xff0c;签名值可以是base64&#xff0c;也可以是十六进制。 兼容各种输入。 0x03 工具使用 RSA 验签 SM2 验签 0x04 工具…

架构师篇 DDD领域驱动设计篇

一 DDD领域驱动设计 1.1 领域驱动设计 领域驱动设计(英文&#xff1a;Domain-Driven Design&#xff0c;缩写DDD)是一种模型驱动设计的方法&#xff0c;领域驱动设计常以战略设计与战术设计来将整个领域展现的淋漓尽致&#xff0c;其作用范围既面向业务也面向技术。从战略角度…

『GitHub项目圈选02』一款可实现视频自动翻译配音为其他语言的开源项目

&#x1f525;&#x1f525;&#x1f525;本周GitHub项目圈选****: 主要包含视频翻译、正则填字游戏、敏感词检测、聊天机器人框架、AI 换脸、分布式数据集成平台等热点项目。 1、pyvideotrans pyvideotrans 是一个视频翻译工具&#xff0c;可将一种语言的视频翻译为另一种语…

完整版解答!2023年数维杯国际大学生数学建模挑战赛B题

B题完整版全部5问&#xff0c;问题解答、代码&#xff0c;完整论文、模型的建立和求解、各种图表代码已更新&#xff01; 大家好&#xff0c;目前已完成2023数维杯国际赛B题全部5问的代码和完整论文已更新&#xff0c;部分展示如下&#xff1a; 部分解答图表 问题分析 B题前三…

打不开github网页解决方法

问题&#xff1a; 1、composer更新包总是失败 2、github打不开&#xff0c;访问不了 解决方法&#xff1a;下载一个Watt Toolkit工具&#xff0c;勾选上&#xff0c;一键加速就可以打开了。 下载步骤&#xff1a; 1、打开网址&#xff1a; Watt Toolkit 2、点击【下载wind…

ROS 学习应用篇(八)ROS中的坐标变换管理之tf广播与监听的编程实现

偶吼吼胜利在望&#xff0c;冲冲冲 老规矩新建功能包 工作空间目录下/src下开启终端输入 catkin_create_pkg learning_tf roscpp rospy tf turtlesim 如何实现tf广播 引入库 c python …

基于猕猴感觉运动皮层Spike信号的运动解码分析不同运动参数对解码的影响

公开数据集中文版详细描述参考前文&#xff1a;https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192神经元Spike信号分析参考前文&#xff1a;https://blog.csdn.net/qq_43811536/article/details/134359566?spm1001.2014.3001.5501神经元运动调制分析参考…

开源简历生成器OpenResume

什么是 OpenResume &#xff1f; OpenResume 是一个功能强大的开源简历生成器和简历解析器。OpenResume 的目标是为每个人提供免费的现代专业简历设计&#xff0c;让任何人都能充满信心地申请工作。 OpenResume 有 5 个核心特点&#xff1a; 特征描述1. 实时UI更新当您输入简历…

如何去掉图片上的水印?这三种去水印的方法帮你解决!

当我们从网上看到喜欢的图片&#xff0c;想要保存下来作为头像或者插入到工作汇报中时&#xff0c;却发现下载的图片带有水印。这不仅影响了图片的美观&#xff0c;还可能对图片的可用性造成影响。那么&#xff0c;如何去掉图片上的水印呢? 实际上&#xff0c;现在市面上的很多…

【项目管理】PMO技能树21项参照

导读&#xff1a;PMO技能树让你能够有全局视野&#xff0c;让你对照着检查自己的能力是否掌握。技能树提供了构建个人知识体系参照和地图导航&#xff0c;不至于迷失方向。 目录 1、PMO层次概览 2、技能树 2.1 项目管理流程 2.2 项目组合管理 2.3 风险管理 2.4 项目资源管…

高品质建筑红模板与耐久黑色覆膜清水模板:建筑质量的双重守护者

高品质建筑红模板&#xff0c;是现代建筑领域中不可或缺的利器。其承载着创新设计与高效施工的双重使命&#xff0c;在工地建筑需求中占据着重要地位。而耐用黑色覆膜清水模板&#xff0c;则是建筑领域中的隐形英雄&#xff0c;为建筑结构提供了可靠的支撑和保护。这两者的结合…

maptalks三维地图网址

三维 地址: http://examples.maptalks.com/examples/cn/gltf/gltf-marker/shader

typora使用PicGo自动上传图片到chevereto图床

typora使用PicGo自动上传图片到chevereto图床 近期发现&#xff0c;gitee图床不能用了。github又涉及科学上网。搜索了开源图床方案&#xff0c;找到了chevereto&#xff0c;使用起来还不错。分享给大家。 文章目录 typora使用PicGo自动上传图片到chevereto图床chevereto图床安…

产品经理必备技能:如何快速锁定种子用户群体?

大家好&#xff0c;我是小米&#xff0c;一名热爱技术、热衷分享的90后小青年。今天我们要探讨的话题是一个在产品经理面试中经常被问到的问题&#xff1a;“产品上线后的种子用户该如何获取&#xff1f;”作为一个热爱挑战、乐于探讨的小伙伴&#xff0c;我将和大家分享一些我…

开源与闭源:创新与安全的平衡

目录 一、开源和闭源的优劣势比较 一、开源软件的优劣势 优势 劣势 二、闭源软件的优劣势 优势 劣势 二、开源和闭源对大模型技术发展的影响 一、机器学习领域 二、自然语言处理领域 三、数据共享、算法创新与业务拓展的差异 三、开源与闭源的商业模式比较 一、盈…

基于供需算法优化概率神经网络PNN的分类预测 - 附代码

基于供需算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于供需算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于供需优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

C语言--从键盘输入10个数字放在数组中,并输出

用scanf读取数字的时候要注意&#xff0c;可以输入一个数字&#xff0c;按一下回车&#xff0c;输入一个数字&#xff0c;按一下回车&#xff0c;也可以一次性输入完10个数据。&#xff08;中间可以用空格隔开&#xff0c;系统会自动识别&#xff09; 输出一:每按下一个数字&am…

redis实战篇03

附近的商户 我们利用Redis的GEOHash来完成对于地理坐标的操作 UV统计 主要是使用Redis来完成统计功能 用户签到 使用Redis的BitMap数据统计功能 好友关注 基于Set集合的关注、取消关注&#xff0c;共同关注等等功能&#xff0c;这一块知识咱们之前就讲过&#xff0c;这次…