JAXB 使用记录 bean转xml xml转bean 数组 继承 CDATA(转义问题)

news2025/4/26 10:21:03

JAXB 使用记录

部分内容引自
https://blog.csdn.net/gengzhy/article/details/127564536

基础介绍

JAXBContext类:是应用的入口,用于管理XML/Java绑定信息
Marshaller接口:将Java对象序列化为XML数据
Unmarshaller接口:将XML数据反序列化为Java对象
@XmlRootElement:将Java类或枚举类型映射到XML元素,用在Java类上,用于标注该类是xml的一个根节点
@XmlElement:将Java类的一个属性映射到与属性同名的一个XML元素。通常与@XmlTransient搭配使用。
@XmlTransient:通常与 @XmlElement 须搭配使用的。@XmlElement用在属性上,用于指定生成xml的节点名,@XmlTransient用在对应的getter方法上,起到关联的作用
@XmlElementWrapper :对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。通常配合XmlElement一起使用,XmlElementWrapper指定数组名,XmlElement指定生成xml的节点名
@XmlElementRef:用在类属性的getter方法上(即该属性是一个JavaBean),并且该属性是某些子类的父类,起到引用的作用。同时标注得有@XmlElementRef的类属性,其子类上需要使用@XmlRootElement标注,否则转换异常,提示找不到具体的引用实现。另外,转换时,需要将其子类的class一起传递到JAXBContext上下文中,否则也无法转换
@XmlAccessorOrder:控制JAXB 绑定类中属性和字段的排序
@XmlType:将Java类或枚举类型映射到XML模式类型
@XmlAccessorType(XmlAccessType.FIELD) :控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标 注)字段到XML。还有XmlAccessType.PROPERTY和XmlAccessType.NONE
@XmlJavaTypeAdapter:使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML
@XmlAttribute:将Java类的一个属性映射到与属性同名的一个XML属性

工具类

package xmlAndBean;

import lombok.extern.slf4j.Slf4j;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Source;
import javax.xml.transform.sax.SAXSource;
import java.io.StringReader;
import java.io.StringWriter;

/**
 * @version : 1.0
 * @Description : xml工具类
 * @Date: 2023/10/9 9:03
 **/

public class XmlBeanUtils {

    /**
     * 构造方法私有
     **/
    private XmlBeanUtils() {
    }

    public static final String ENCODING_UTF = "UTF-8";
    public static final String ENCODING_GB = "GB18030";

    /**
     * @return java.lang.String
     * @Description : bean转xml不含报文头(GB18030编码格式)
     * @Param [obj]
     * @Param encoding 编码格式
     **/
    public static String beanToXml(Object obj,String encoding) {
        String result = null;
        try {
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            Marshaller marshaller = context.createMarshaller();
            // Marshaller.JAXB_FORMATTED_OUTPUT 决定是否在转换成xml时同时进行格式化(即按标签自动换行,否则即是一行的xml)
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            // Marshaller.JAXB_ encoding  xml的编码方式
            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
            // 去掉生成xml的默认报文头
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);
            result = writer.toString();
        } catch (Exception e) {
//            log.error("bean转xml报文失败", e);
        }
        return result;
    }


    /**
     * @return java.lang.String
     * 报文格式:
     * <?xml version="1.0" encoding="GB18030"?>
     * <ROOT>
     * <HEAD>
     * …
     * </HEAD>
     * <DATA>
     * <title1 >…</title1>
     * <title2 >…</title2>
     * …
     * </DATA>
     * </ROOT>
     * @Description : 组装报文
     * @Param [xmlHead, xmlData]
     **/
    public static String indentFormat(String xmlHead, String xmlData) {
        try {
            String xmlHeader = "<?xml version=\"1.0\" encoding=\"GB18030\"?>\n";
            StringBuilder xml = new StringBuilder();
            xml.append(xmlHeader).append("<ROOT>\n").append(xmlHead).append(xmlData).append("\n</ROOT>");
            return xml.toString();
        } catch (Exception e) {
//            log.error("组装xml报文失败", e);
            return null;
        }
    }

    /**
     * xml转对象
     *
     * @param xml
     * @param msgVo
     * @param <T>
     * @return
     */
    public static <T> T xmlToBean(String xml, Class<T> msgVo) {
        if (msgVo == null) {
            return null;
        }
        try {
            JAXBContext context = JAXBContext.newInstance(msgVo);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Source source = trunSource(xml);
            return (T) unmarshaller.unmarshal(source);
        } catch (Exception e) {
//            log.error("xml转对象异常:", e);
        }
        return null;
    }

    /**
     * 忽略xml命名空间
     *
     * @param xmlStr
     * @return
     * @throws SAXException
     * @throws ParserConfigurationException
     */
    private static Source trunSource(String xmlStr) throws SAXException, ParserConfigurationException {
        StringReader reader = new StringReader(xmlStr);
        SAXParserFactory sax = SAXParserFactory.newInstance();
        sax.setNamespaceAware(false);
        XMLReader xmlReader = sax.newSAXParser().getXMLReader();
        return new SAXSource(xmlReader, new InputSource(reader));
    }


    /**
     * Java Bean 转 Xml
     *
     * @param bean         - Java Bean
     * @param inheritClazz - Java Bean中嵌套的类,且有继承关系的Java Class
     * @return - xml
     */
    public static String beanToXml(Object bean, String encoding,Class<?>... inheritClazz) {
        try {
            JAXBContext context = initContext(bean.getClass(), inheritClazz);
            Marshaller marshaller = context.createMarshaller();
            // 格式化xml
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            // Marshaller.JAXB_ encoding  xml的编码方式
            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
            // 去掉生成xml的默认报文头
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

            StringWriter writer = new StringWriter();
            marshaller.marshal(bean, writer);
            return writer.toString();
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Xml 转 Java Bean
     *
     * @param xml          - xml
     * @param beanClazz    - Java Bean Class
     * @param inheritClazz - Java Bean中嵌套的类,且有继承关系的Java Class
     * @return - bean
     */
    public static Object xmlToBean(String xml, Class<?> beanClazz, Class<?>... inheritClazz) {
        try {
            JAXBContext context = initContext(beanClazz, inheritClazz);
            Unmarshaller um = context.createUnmarshaller();
            StringReader sr = new StringReader(xml);
            return um.unmarshal(sr);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 初始化JAXBContext
     *
     * @param mainClazz    - 序列化或反序列化Class
     * @param inheritClazz - Java Bean中嵌套的类,且有继承关系的Java Class
     * @return - JAXBContext
     */
    private static JAXBContext initContext(Class<?> mainClazz, Class<?>... inheritClazz) throws JAXBException {
        JAXBContext context;
        if (inheritClazz != null) {
            Class<?>[] clazzArr = new Class[inheritClazz.length + 1];
            clazzArr[0] = mainClazz;
            System.arraycopy(inheritClazz, 0, clazzArr, 1, clazzArr.length - 1);
            context = JAXBContext.newInstance(clazzArr);
        } else {
            context = JAXBContext.newInstance(mainClazz);
        }
        return context;
    }


}

xml结构

结构如下:

<ROOT>
<HEAD></HEAD>
<DATA>
		<title1 ></title1>
		<title2 ></title2><RECORD>
            <LIST1 p_type="G">
                <title1 ></title1>
            </LIST1>
            <LIST1 p_type="G">
                <title1 ></title1>
            </LIST1>
        </RECORD>
</DATA>
</ROOT>

①存在继承关系的bean转xml

基类:用于统一,方便向下转型

/**
 * @version : 1.0
 * @Description : 基类
 * @Date: 2023/10/9 19:55
 **/
public class BaseDTO {
}

DATA标签实体类同时继承基类

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.List;

/**
 * @version : 1.0
 * @Description :
 * @Date: 2023/10/9 19:55
 **/
@Setter
@Getter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "DATA")
public class BookDTO extends BaseDTO{

    @XmlElement(name = "name")
    @XmlJavaTypeAdapter(CdataXmlAdapter.class)
    private String bookName;

    @XmlElement(name = "id")
    private String bookId;

    //@XmlElementWrapper(name = "RECORD")
//    @XmlElement(name = "LIST1")
//    private List<DescDTO> descDTOList;
}

HEAD标签实体类

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * @version : 1.0
 * @Description :
 * @Date: 2023/10/9 19:58

 **/
@Getter
@Setter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "HEAD")
public class HeadDTO {

    @XmlElement(name = "SEND_NODE")
    private String send;


    @XmlElement(name = "RECV_NODE")
    private String receive;
}

根标签实体类
其中针对DATA标签,每个接口的DATA标签可能都不相同,这里使用了@XmlElementRef标签结合基类(BaseDTO ),在使用中将接口的实体类继承BaseDTO基类,并标注@XmlRootElement(name = “DATA”),即可实现每个接口拥有独立的对象实现bean转xml

import lombok.*;

import javax.xml.bind.annotation.*;

/**
 * @version : 1.0
 * @Description :
 * @Date: 2023/10/9 19:55
 **/
@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
//@XmlType(propOrder = { "head", "data" }) 这句加不加无所谓
@XmlRootElement(name = "ROOT")
public class RootDTO {

    @XmlElement(name = "HEAD")
    private HeadDTO head;

    //@XmlElement(name = "DATA")
    //@XmlElementRef 注解要加载对象上不能加在get方法上,不然报错如下
    //com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 5 counts of IllegalAnnotationExceptions类的两个属性具有相同名称 "head"
    @XmlElementRef(name = "DATA")
    private BaseDTO data;
    
}

测试类

public class XmlTest {

    public static void main(String[] args) {

		//继承基类
        BookDTO bookDTO = new BookDTO();
        bookDTO.setBookName("name");
        bookDTO.setBookId("id");
		//HEAD标签实体类,一般内容固定
        HeadDTO headDTO = new HeadDTO();
        headDTO.setSend("send");
        headDTO.setReceive("rece");

        RootDTO rootDTO = new RootDTO();
        rootDTO.setHead(headDTO);
        //因为BookDTO 继承基类所以此处能设置成功
        rootDTO.setData(bookDTO);


        //bean转xml,需要将BookDTO.class(子类)传入以告知
        System.out.println(XmlBeanUtils.beanToXml(rootDTO,XmlBeanUtils.ENCODING_GB,BookDTO.class));
        //xml转bean
        System.out.println(XmlBeanUtils.xmlToBean(xml,  RootDTO.class,BookDTO.class));
    }
}

运行结果:
在这里插入图片描述

②存在数组的bean转xml

DATA标签实体类同时继承基类

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.List;

/**
 * @version : 1.0
 * @Description :
 * @Date: 2023/10/9 19:55
 **/
@Setter
@Getter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "DATA")
public class BookDTO extends BaseDTO{

    @XmlElement(name = "name")
    @XmlJavaTypeAdapter(CdataXmlAdapter.class)
    private String bookName;

    @XmlElement(name = "id")
    private String bookId;

    //@XmlElementWrapper(name = "RECORD")
    @XmlElement(name = "LIST1")
    private List<DescDTO> descDTOList;
}

数组实体类对象

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.xml.bind.annotation.*;

/**
 * @version : 1.0
 * @Description :
 * @Date: 2023/10/10 10:25
 **/
@Getter
@Setter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "LIST1")
public class DescDTO{

    @XmlAttribute(name = "p_type")
    private String pType;

    @XmlElement(name = "description")
    private String description;
}

假设在DATA标签实体类中存在数组属性,则使用@XmlElement(name = “LIST1”)进行标注,即可实现每个数组对象转换成xml时都被<LIST1> </LIST1>包裹
测试类

public class XmlTest {

    public static void main(String[] args) {


        BookDTO bookDTO = new BookDTO();
        bookDTO.setBookName("name");
        bookDTO.setBookId("id");

        HeadDTO headDTO = new HeadDTO();
        headDTO.setSend("send");
        headDTO.setReceive("rece");

        RootDTO rootDTO = new RootDTO();
        rootDTO.setHead(headDTO);
        rootDTO.setData(bookDTO);

        DescDTO descDTO = new DescDTO();
        //descDTO.setPType("G");
        descDTO.setDescription("desc11111");
        DescDTO descDTO1 = new DescDTO();
        //descDTO1.setPType("G");
        descDTO1.setDescription("desc22222");

        ArrayList<DescDTO> descDTOS = new ArrayList<>();
        descDTOS.add(descDTO);
        descDTOS.add(descDTO1);
        bookDTO.setDescDTOList(descDTOS);

        String xml = XmlBeanUtils.beanToXml(rootDTO, XmlBeanUtils.ENCODING_GB, BookDTO.class);
        //bean转xml
        System.out.println(XmlBeanUtils.beanToXml(rootDTO,XmlBeanUtils.ENCODING_GB,BookDTO.class));
        //xml转bean
        System.out.println(XmlBeanUtils.xmlToBean(xml,  RootDTO.class,BookDTO.class));
    }
}

运行结果
在这里插入图片描述
如果需要再在数组外面套一层标签则:

    @XmlElementWrapper(name = "RECORD")
    @XmlElement(name = "LIST1")
    private List<DescDTO> descDTOList;

运行结果:
在这里插入图片描述

③存在数组且数组前后标签要求不一致的bean转xml

<LIST1 p_type="G">标签开始,以</LIST1>标签结束
在数组对象中引入@XmlAttribute

    @XmlAttribute(name = "p_type")
    private String pType;

测试类:

//设置属性
descDTO.setPType("G");
public class XmlTest {

    public static void main(String[] args) {


        BookDTO bookDTO = new BookDTO();
        bookDTO.setBookName("name");
        bookDTO.setBookId("id");

        HeadDTO headDTO = new HeadDTO();
        headDTO.setSend("send");
        headDTO.setReceive("rece");

        RootDTO rootDTO = new RootDTO();
        rootDTO.setHead(headDTO);
        rootDTO.setData(bookDTO);

        DescDTO descDTO = new DescDTO();
        descDTO.setPType("G");
        descDTO.setDescription("desc11111");
        DescDTO descDTO1 = new DescDTO();
        descDTO1.setPType("G");
        descDTO1.setDescription("desc22222");

        ArrayList<DescDTO> descDTOS = new ArrayList<>();
        descDTOS.add(descDTO);
        descDTOS.add(descDTO1);
        bookDTO.setDescDTOList(descDTOS);

        String xml = XmlBeanUtils.beanToXml(rootDTO, XmlBeanUtils.ENCODING_GB, BookDTO.class);
        //bean转xml
        System.out.println(XmlBeanUtils.beanToXml(rootDTO,XmlBeanUtils.ENCODING_GB,BookDTO.class));
        //xml转bean
        System.out.println(XmlBeanUtils.xmlToBean(xml,  RootDTO.class,BookDTO.class));
    }
}

运行结果:
在这里插入图片描述

④针对<![CDATA[文本内容]]>标签

import javax.xml.bind.annotation.adapters.XmlAdapter;

/**
 * @version : 1.0
 * @Description : <![CDATA]>
 * @Date: 2023/10/8 19:03
 **/
public class CdataXmlAdapter extends XmlAdapter<String, String> {
    public CdataXmlAdapter() {
    }

    public String marshal(String arg0) throws Exception {
        return "<![CDATA[" + arg0 + "]]>";
    }

    public String unmarshal(String arg0) throws Exception {
        return arg0;
    }
}

使用@XmlJavaTypeAdapter注解,在需要的字段上

	@XmlElement(name = "name")
    @XmlJavaTypeAdapter(CdataXmlAdapter.class)
    private String bookName;

运行结果:
在这里插入图片描述

解决转义问题:
思路:
在将对象转换成xml时,会用到Marshaller对象,调用该对象的setProperty方法,注入第三步中实现的类,控制转换时不进行转义,实现自定义的CharacterEscapeHandler类,拦截JAXB的转义动作

在工具类原有的基础上引入下面的语句:
jar包
import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler;

			//CData处理
            marshaller.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() {
                public void escape(char[] ch, int start,int length, boolean isAttVal, Writer writer) throws IOException {
                    writer.write(ch, start, length);
                }
            });

完整方法:

/**
     * Java Bean 转 Xml
     *
     * @param bean         - Java Bean
     * @param inheritClazz - Java Bean中嵌套的类,且有继承关系的Java Class
     * @return - xml
     */
    public static String beanToXml(Object bean, String encoding,Class<?>... inheritClazz) {
        try {
            JAXBContext context = initContext(bean.getClass(), inheritClazz);
            Marshaller marshaller = context.createMarshaller();
            // 格式化xml
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            // Marshaller.JAXB_ encoding  xml的编码方式
            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
            // 去掉生成xml的默认报文头
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
            //CData处理
            marshaller.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() {
                public void escape(char[] ch, int start,int length, boolean isAttVal, Writer writer) throws IOException {
                    writer.write(ch, start, length);
                }
            });

            StringWriter writer = new StringWriter();
            marshaller.marshal(bean, writer);
            return writer.toString();
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return null;
    }

运行结果:
在这里插入图片描述

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

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

相关文章

基于JAVA SpringBoot和Vue小说在线听书网站设计

摘要 移动互联网技术的不断发展&#xff0c;人们学习场景和支付习惯的不断变化&#xff0c;为知识支付的兴起提供了有利条件。知识支付逐渐成为人们弥补碎片化阅读习惯、获取知识的一种流行方式。知识付费市场日益扩大&#xff0c;在这波浪潮中&#xff0c;以喜马拉雅和知乎为首…

5Spring及Spring系列-进阶

8.1spring进阶 spring常用注解 1.Component 它是这些注解里面最普通的一个注解&#xff0c;一般用于把普通pojo实例化到spring容器中。 Controller和Service和Repository是它的特殊情况&#xff0c;当一个类不需要进行这几种特殊归类的时候&#xff0c;只是作为一个普通的类&am…

【算法|双指针系列No.8】leetcode18. 四数之和

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

VSCode 使用 Vetur Format格式化的配置项

"vetur.format.options.tabSize": 4,"vetur.format.defaultFormatterOptions": {// for html"prettyhtml": {"wrapAttributes":false,//强制包装属性// "sortAttributes": true,//对属性按首字母排序// "bracketSpacin…

Apache Tomcat下载安装配置使用超详细

下载安装 tomcat官网 在此我们以Tomcat 9.0.81为例&#xff0c;点击下载压缩包&#xff0c;解压到自己的文件夹。 tar.gz是linux操作系统下的安装版本。zip是windows系统下的压缩版本。Windows Service Installer是windows操作系统下的exe安装版本。 检查是否配置JDK 1.…

Ubuntu 22.04.3 LTS单机私有化部署sealos

推荐使用奇数台 Master 节点和若干 Node 节点操作系统 :Ubuntu 22.04 LTS内核版本 :5.4 及以上配置推荐 :CPU 4 核 , 内存 8GB, 存储空间 100GB 以上最小配置 :CPU 2 核 , 内存 4GB, 存储空间 60GB 这里采用的Ubuntu 22.04.3 LTS 版本&#xff0c;Ubuntu 20.04.4 LTS这个版本…

JUC并发编程——JUC并发编程概述及Lock锁(重点)(基于狂神说的学习笔记)

基于bilibili狂神说JUC并发编程视频所做笔记 概述 什么是JUC JUC时java.util工具包中的三个包的简称 java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks 业务&#xff1a;普通的线程代码中&#xff0c;我们常使用Runnable接口 但Runnable没有返…

如何将jpg转化为png?

如何将jpg转化为png&#xff1f;可能有的小伙伴就会疑惑了&#xff0c;jpg和png都是图片常用的一种格式&#xff0c;为什么要进行格式的更改呢&#xff1f;那是因为PNG格式具有更好的图片质量和更少的失真。JPG&#xff08;或JPEG&#xff09;格式的图片通常是压缩过的&#xf…

C# OpenVINO 人脸识别

效果 耗时 Preprocess: 1.41ms Infer: 4.38ms Postprocess: 0.03ms Total: 5.82ms 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Text; using Syste…

ChatGPT再次成为焦点:学生放弃导师,改用ChatGPT自学

据外媒报道&#xff0c;近日&#xff0c;知名高等教育规划平台 Intelligent.com 的一项 调查显示&#xff0c;学生和家长越来越喜欢使用 ChatGPT 而不是真人导师来进行学习了。 调查结果显示&#xff0c;学生对教育援助的看法发生了重大的转变。在最近的学年中&#xff0c;85% …

解决yarn删除代理不成功的问题

之前yarn配了代理&#xff0c;但是速度不稳定&#xff0c;所以换成了淘宝源。 然后发现速度还是很慢&#xff0c;有一天忘了开代理&#xff0c;结果依赖完全不能下载了&#xff0c;报错&#xff1a;info There appears to be trouble with your network connection. Retrying.…

WebSocket连接异常 Error parsing HTTP request header Connection reset by peer

问题描述 在使用spring的方式集成websocket时&#xff0c;在配置WebSocketConfigurer后 Configuration EnableWebSocket public class WebSocketConfiguration implements WebSocketConfigurer {ResourceServletWebSocketServerHandler servletWebSocketServerHandler;Overri…

Android笔记(三)多Activity活动的切换中的简化处理

多Activity实现的跳转简单实现 Activity定义移动的界面。在本例中&#xff0c;介绍多个活动之间的切换的简化通用的实现。在本例中&#xff0c;定义三个活动MainActivity、FirstActivity和SecondActivity.要求能从MainActivity分别切换到FirstActivity和SecondActivity&#x…

VMware _ Ubuntu _ root 密码是什么,怎么进入 root 账户

文章目录 进入 root 账户设置 root 密码小结 在 VMware 安装 ubuntu 虚拟机之后&#xff0c;root 用户的密码是什么&#xff1f;安装的过程也没有提示输入 root 用户的密码&#xff0c;只有创建第一个非 root 用户的密码。但是 root 用户是存在的&#xff0c;又怎么切换到 root…

【面试高频题】难度 1/5,经典树的搜索(多语言)

题目描述 这是 LeetCode 上的 「109. 有序链表转换二叉搜索树」 &#xff0c;难度为 「中等」 Tag : 「二叉树」、「树的搜索」、「分治」、「中序遍历」 给定一个单链表的头节点 head&#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&…

Webpack和JShaman相比有什么不同?

Webpack和JShaman相比有什么不同&#xff1f; Webpack的功能是打包&#xff0c;可以将多个JS文件打包成一个JS文件。 JShaman专门用于对JS代码混淆加密&#xff0c;目的是让JavaScript代码变的不可读、混淆功能逻辑、加密代码中的隐秘数据或字符&#xff0c;是用于代码保护的…

Android笔记(四)Activity之间传递可序列化的数据的优化处理

Activity之间传递可序列化的数据 Android应用开发会常常处理数据的序列化和传递。在Android中往往采用两种方式实现数据的可序列化&#xff1a;&#xff08;1&#xff09;实现java.io.Serializable接口&#xff08;2&#xff09;实现android.os.Parcelable接口。 将类定义为an…

C++标准模板(STL)- 类型支持 (数值极限,is_modulo,digits,digits10)

数值极限 定义于头文件 <limits> 定义于头文件 <limits> template< class T > class numeric_limits; numeric_limits 类模板提供查询各种算术类型属性的标准化方式&#xff08;例如 int 类型的最大可能值是 std::numeric_limits<int>::max() &…

Appium自动化测试框架:关键字驱动+数据驱动

1. 关键字驱动框架简介 原理及特点 关键字驱动测试是数据驱动测试的一种改进类型&#xff0c;它也被称为表格驱动测试或者基于动作字的测试。主要关键字包括三类&#xff1a;被操作对象&#xff08;Item&#xff09;、操作行为&#xff08;Operation&#xff09;和操作值&…

[python 刷题] 239 Sliding Window Maximum

[python 刷题] 239 Sliding Window Maximum 题目&#xff1a; You are given an array of integers nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each ti…