file-storage-sdk项目开发中的踩坑记录

news2024/11/24 18:44:40

文章目录

  • file-storage-sdk项目开发中的踩坑记录
    • 问题1:项目启动报错:`Attribute "@click" appears more than once in element`
    • 问题2:前端对话框被遮挡
    • 问题3:@RequestBody无法接收表单数据
    • 问题4:文件上传失败
    • 问题5:Java代码编译后方法的参数名发生了改变
    • 问题6:前端接收的data一直为null
    • 问题7:axios中的this指向问题、event无法传递
    • 问题8:无法展示二进制流的图片
    • 问题9:ElementUI的img组件无法展示阿里云图片链接
    • 问题10:阿里云OSS分片上传失败
    • 问题11:启动出现循环依赖问题
    • 问题12:使用ant desing的upload组件上传文件后端包格式转换错误
    • 问题13:使用RabbitMQ结果报错
  • 总结

file-storage-sdk项目开发中的踩坑记录

问题1:项目启动报错:Attribute "@click" appears more than once in element

  • 问题背景:在编写前端代码时启动报错org.attoparser.ParseException: (Line = 66, Column = 74) Malformed markup: Attribute "@click" appears more than once in element
  • 问题原因:Thymeleaf 和 Vue 混用导致的
  • 问题解决:将@click替换成v-on:click

参考文章

  • vue与thymeleaf结合使用注意事项

问题2:前端对话框被遮挡

  • 问题背景:我在实现上传文件的SDK时,我需要在上传之后弹出对话框展示上传文件列表,用户点击确认之后就进行上传,但是发现对话框居然被遮罩层给遮挡了

  • 问题原因:这个是由于modal-append-to-body默认是true,导致默认遮罩层是遮挡父元素的

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    将他设置为fasle,结果发现遮挡了表格,这是由于append-to-body默认属性是false导致的,导致弹窗默认是插入父元素,并不会插入body元素上,然后将它设置为 true

  • 问题解决

            <el-dialog
                    title="是否确认上传"
                    :visible.sync="dialogVisible"
                    width="30%"
                    :modal-append-to-body="false"
                    :append-to-body="true">
    

参考文章

  • 组件 | Element

问题3:@RequestBody无法接收表单数据

  • 问题背景:在使用 vue-simple-uploder 上传文件数据时,后端直接报错 WARN 26176 --- [io-10086-exec-9] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=----WebKitFormBoundaryCA6Bc2bnpcwGa9eq;charset=UTF-8' not supported]
  • 问题原因@RequestBody只能接收请求体中的 JSON 数据,无法接收表单数据
  • 问题解决:讲后端标记的 @RequestBody 给去掉即可

参考文章

  • SpringBoot中表单提交报错“Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported“

问题4:文件上传失败

  • 问题背景:在实现 file-stroage-sdk 项目时,前端分片上传,每一片5MB,结果出错

    org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 5242880 bytes.

  • 问题原因:SpringBoot内置的Tomcat默认只接受 1MB 以内的文件,超过 1MB 会直接抛出上诉异常

  • 问题解决:添加如下配置文件

    spring:
      servlet:
        multipart:
          max-file-size: 10MB # 单个上传文件的最大限制大小
          max-request-size: 20MB # 单次请求的最大限制大小
    

    参考文章

    • 使用springboot上传文件出现org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException异常

问题5:Java代码编译后方法的参数名发生了改变

  • 问题背景:在开发 file-storage-sdk 时,经过 mvn install 命令编译打包下载到本地Maven仓库,在另一个 file-storage-sdk-demo 中引用,结果发现方法参数名发生了改变,本来的方法参数名是可以见名知义的,但是全都变为了 var1、var2、var3……

  • 问题原因:这是由于 编译优化 的原因,我们平常写的 Java 代码,在编译时会对代码进行一个编译优化

  • 问题解决

    最开始我通过配置 IDEA 的设置(相关操作可以直接看下面提供的链接),保障编译之后保留方法参数名,但是发现并没有用,我于是就通过配置 Maven 插件保障编译之后能够保留方法参数名

        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>${maven.compiler.source}</source>
                        <target>${maven.compiler.target}</target>
                        <!-- 确保编译之后方法参数命不发生改变 -->
                        <compilerArgs>
                            <arg>-parameters</arg>
                        </compilerArgs>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    

注意:这个只能在 Java8 之后才能解决,Java8 之前的代码是无法做到的

参考文章

  • jdk1.8 开启-parameters参数,编译保留参数名,为反射提供便利_master336的博客-CSDN博客

  • IDEA如何编译时强制保持方法参数变量名? - 知乎 (zhihu.com)

  • Java编译保留方法参数名称_idea2020 编译保留参数名_catoop的博客-CSDN博客

问题6:前端接收的data一直为null

  • 问题背景:在实现 查询文件列表时,后端查询数据成功了,并且页成功响应给前端了,前端也成功接收到数据了,结果发现 axios 发送请求后的成功回调中 response 的 data 数据项一直为null

  • 问题原因:首先我说一下这个问题的原因,由于我的ResposneResult 中没有对 data 进行赋值。

    这个问题相当的低级,但是我真的被卡了将近 30 min ,我实在没想过居然是我的 ResponseResult 出错了,我也没有动这个 ResponseResult 类啊?我一般是直接 CV 以前的来用,结果排查判断,我把错误归咎到前端,硬是排查了 30多分钟,结果无耐,一步一步点进去看,结果发现是 ResponseResult 中没有对 data 进行赋值😫真的服了

  • 问题解决:在ResponseResult中赋值data ,即 this.data = data;

问题7:axios中的this指向问题、event无法传递

  • 问题背景:想要绑定一个加载图片的事件,结果在axios内部调用this,发现报错了一个 未定义的错误
  • 问题原因
  • 问题解决

已废弃,问题7和问题8是一起的,这两个问题我已经通过换一种思路实现了,之前我展示 云存储上私有空间的图片,我是直接请求下载接口,将图片下载下来,然后传递给前端,前端将二进制流解析成图片展示,但是发现这种方式太麻烦了,

展示阿里云OSS上私有空间的图片,可以使用两种方式:直接请求后端接口获取授权URL,或者通过请求后端接口下载OSS中的图片并传递给前端。

  1. 直接请求后端接口获取授权URL:这种方式较为常见。当需要展示私有空间的图片时,前端向后端请求授权URL,后端验证用户身份和权限,并生成一个带有签名的临时URL。然后,前端将这个授权URL直接作为图片的 src 属性值,浏览器会发送请求到OSS服务器加载图片。这种方式不需要后端将图片下载并传递给前端,而是直接由浏览器请求加载。
  2. 通过请求后端接口下载OSS中的图片并传递给前端:这种方式在某些情况下也可行。前端向后端发送请求,后端验证用户身份和权限,并从OSS中下载对应的图片。然后,后端将图片以二进制流的形式返回给前端,前端再通过解析二进制流生成图片进行展示。这种方式可以用于一些特殊需求,例如需要对图片进行二次处理或保护图片真实地址等情况。

一般来说,直接请求后端接口获取授权URL是更常见和推荐的方式。这样可以避免后端多余的数据传输和资源开销,并且利用了OSS的访问控制机制,提高了安全性。

问题8:无法展示二进制流的图片

  • 方式一:responseType: 'arraybuffer'

                arrayBufferToBase64(buffer) {
                    let binary = '';
                    let bytes = new Uint8Array(buffer);
                    let len = bytes.byteLength;
                    for (let i = 0; i < len; i++) {
                        binary += String.fromCharCode(bytes[i]);
                    }
                    return window.btoa(binary);
                },
                // 图片加载失败时将其替换为默认加载失败图片
                handleImageError(event) {
                    var _this = this;
                    var image = event.target
                    axios.post('/file/download', {fileUrl: event.target.currentSrc}, {responseType: 'arraybuffer'})
                        .then(resp => {
                            debugger
                            image.src = `data:image/jpeg;base64,${_this.arrayBufferToBase64(resp)}`
                            // event.target.src = `data:image/jpeg;base64,${_this.arrayBufferToBase64(resp)}`
                        }).catch(error => {
                        debugger
                        event.target.src = "images/file_error.jpg";
                    });
                }
    
  • 方式二:responseType: 'blob'

    function convertBlobToImage(blob) {
      return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onloadend = function() {
          const imgSrc = reader.result;
          const imgElement = document.createElement('img');
          imgElement.src = imgSrc;
          resolve(imgElement);
        };
        reader.onerror = reject;
        reader.readAsDataURL(blob);
      });
    }
    
    axios.post('/file/download', { fileUrl: 'https://example.com/image.jpg' }, { responseType: 'blob' })
      .then(response => {
        const blob = response.data;
        return convertBlobToImage(blob);
      })
      .then(imgElement => {
        const imageContainer = document.getElementById('imageContainer');
        imageContainer.appendChild(imgElement);
      })
      .catch(error => {
        console.error(error);
      });
    

问题9:ElementUI的img组件无法展示阿里云图片链接

<el-image
        style="width: 80px; height: 80px"
        :src="https://file-storage-sdk.oss-cn-guangzhou.aliyuncs.com/test/image/2023/09/01/1693575185713.jpg?Expires=1693628500&OSSAccessKeyId=LTAI5tGwejaWwLbmcNBEjrBo&Signature=SeEvQmzCbgm2nId9egqT%2FjeYzRU%3D"
        @error="handleImageError"
        :preview-src-list="[scope.row.fileUrl]">
</el-image>

无法直接展示,这是由于 src属性 无法解析链接中的查询参数,这样写,前端不会报错,但是会导致整个页面处于空白状态

解决方法:

1)方式一:使用模板字符串``

模板字符串``能够直接让整个字符串是真正的字符串,告诉 src 属性这个 URL 不需要解析

<el-image
        style="width: 80px; height: 80px"
        :src="`https://file-storage-sdk.oss-cn-guangzhou.aliyuncs.com/test/image/2023/09/01/1693575185713.jpg?Expires=1693628500&OSSAccessKeyId=LTAI5tGwejaWwLbmcNBEjrBo&Signature=SeEvQmzCbgm2nId9egqT%2FjeYzRU%3D`"
        @error="handleImageError"
        :preview-src-list="[scope.row.fileUrl]">
</el-image>

2)方式二:在 data 中定义URL

这种方式的原理和模板字符串是一样的

<el-image
        style="width: 80px; height: 80px"
        :src="url"
        @error="handleImageError"
        :preview-src-list="[scope.row.fileUrl]">
</el-image>

        data() {
            return {
                url:'https://file-storage-sdk.oss-cn-guangzhou.aliyuncs.com/test/image/2023/09/01/1693575185713.jpg?Expires=1693628500&OSSAccessKeyId=LTAI5tGwejaWwLbmcNBEjrBo&Signature=SeEvQmzCbgm2nId9egqT%2FjeYzRU%3D'
			}
	`	}

3)方式三:逻辑转换

直接修改传递 index属性,然后更新 tableData

注意更新不能直接使用 = 进行赋值,可以使用 this.$set()

问题10:阿里云OSS分片上传失败

  • bug1:上传直接报错The upload ID may be invalid, or the upload may have been aborted or completed

    <Error>
      <Code>NoSuchUpload</Code>
      <Message>The specified upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed.</Message>
      <RequestId>64F2FE89FBA3A939312E6EAE</RequestId>
      <HostId>file-storage-sdk.oss-cn-guangzhou.aliyuncs.com</HostId>
      <UploadId>8A2877C216304F1286F8796BB32CFB42</UploadId>
      <EC>0042-00000104</EC>
    </Error>
    

    结果经过测试,发现 uploadId 创建时的 key 和 每一个分片的 key 必须是一一致的,这样才能分片上传成功

    问题解决:我的思路,是直接使用一个 Map 存储第一个分片的 key,由于我前端计算了 md5 值对于所有分片而言是唯一的,所以我每次只需要获取一次对应分片的 key,没有 key 时 才进行新建,从而确保每一个分片的 key 是唯一的

    注意:由于我使用了Map,Map是基于服务器内存的,所以同时 set 是很容易出现并发安全问题的,基于这两点,我直接

  • bug2:使用阿里云OSS分片上传时,每次到最后一片时,都无法成功,并且报错java.net.SocketTimeoutException: Read timed out

    问题原因:通过层层排查,发现居然问题处在一个超级细节上,原因是我前端切片,在传递切片大小时都是 chunkSize,而我在使用阿里云OSS分片上传时,每次都是直接使用 chunkSize 作为当前块的大小,由于文件最后一片的大小大概率是要小于 chunkSize 的,所以这就导致 在上传最后一片时,由于我设置了 chunkSize ,而最后一片的大小是小于 chunkSize 的,所以导致最后一片数据不够,OssClient 一直处于等待状态,这就导致链接超时了,最终直接被强制断开

    问题解决:每次设置 分片大小,都以当前文件流的大小为准

    uploadFile.getSize()
    

问题11:启动出现循环依赖问题

我在 fileChunkServiceImpl 注入了 fileInfoServiceImpl 对象,然后再 fileInfoServiceImpl 又注入了 fileChunkServiceImpl 对象,从而导致循环依赖问题

Description:

The dependencies of some of the beans in the application context form a cycle:

   fileController
┌─────┐
|  fileChunkServiceImpl
↑     ↓
|  fileInfoServiceImpl
└─────┘

这个是最经典,也是简单的循环依赖问题了,直接将 fileChunkServiceImpl 的逻辑统一放到 fileInfoServiceImpl 中就可以了

备注:循环依赖问题是一个很常见的问题,网上也有很多文章,我打算之后抽出一段时间仔细研究一下,然后总结一篇文章

问题12:使用ant desing的upload组件上传文件后端包格式转换错误

  • 问题背景: 我后端单独使用一个FileDTO对象接收前端的文件数据类型,结果报错org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:388)

  • 问题原因:文件数据不支持 json 格式传递,仅支持 表单 格式传递

  • 解决方法

            formData.append('chunkNumber', '1');
            formData.append('chunkSize', file.size);
            formData.append('currentChunkSize', file.size);
            formData.append('totalSize', file.size);
            formData.append('identifier', "123");
            formData.append('filename', file.filename);
            formData.append('relativePath', file.relativePath);
            formData.append('totalChunks', '1');
            formData.append('file', file);
    

问题13:使用RabbitMQ结果报错

这个bug并不是 file-storage-sdk项目的,是另一个项目的,这里就一起记录到这个文章中了,也懒得单独拿一篇文章记录一个bug

项目启动循环报错,一直出现下面的异常信息,我一开始还以为是我配置问题,后面翻译了以下,然后结合这个 DispatcherServlet经典类,我就注意到可能是SpringMVC的问题,我之前从没出现过这个问题,后面想了一下可能是 队列监视方法不能写在Controller标注的类中,因为我图方便,就一股脑将所有的逻辑写在了Controller中,结果遇到这个坑了

Caused by: java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.:java.lang.IllegalStateException: No thread-bound request found:您是在实际web请求之外引用请求属性,还是在原始接收线程之外处理请求?如果你实际上是在一个web请求中操作,并且仍然收到这个消息,你的代码可能在DispatcherServlet之外运行:在这种情况下,使用RequestContextListenerRequestContextFilter来公开当前请求。
  • 问题原因:在Spring MVC中,@RabbitListener注解默认在一个单独的线程中执行,而不是在Web请求的上下文中。(具体原因是也不是很清楚,这是GPT的回答,很懵逼,感觉这个应该涉及到底层知识了吧,我一个初学者,对这些东西是真的不懂,如果有大佬知道的话,恳请告诉我出现这个问题的原因,在此谢过了(●’◡’●))

  • 问题解决

    @RabbitListener标记的方法,放到一个不是Controller注解标记的类,比如放在 @Component@Configuration注解标记的类

总结

bug踩多了,经验就丰富了,这个文章中的许多 bug 我觉得还是比较常见的,但是发现好多bug都是在于莫方面知识的缺乏,比如,接连遇到几个前端问题,当然前端有很多问题 其实我之前就遇到过了,这一次遇到可能以下就发现了,但是我还是把它记录下来了,为了让更多人看到,少走过我踩过的坑

其中有一些bug的原因,我可能是解释有问题,或者说您有更好、更正确的解释,欢迎告诉博主,博主不胜感激,当然,最后,如果大家感兴趣的可以,添加一下下方本人的微信公众号,这个公众号是上个月开通的,我会在公众号上分享一些我的有趣的工具,或者是一些我珍藏的笔记(●ˇ∀ˇ●)

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

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

相关文章

WebServer 解析HTTP 响应报文

一、基础API部分&#xff0c;介绍stat、mmap、iovec、writev、va_list 1.1 stat​ 作用&#xff1a;获取文件信息 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h>// 获取文件属性&#xff0c;存储在statbuf中 int stat(const char *…

Excel必备!6种快速插入√或x标记的方法揭秘

本教程展示了在Excel中插入勾或叉的六种不同方法。Excel中有两种复选标记——交互式复选框和勾号符号。 勾选框,也称为复选框或复选标记框,是一种特殊控件,允许你通过鼠标单击来选择或取消选择某个选项,即选中或取消选中勾选框。​ 勾号符号,也称为复选符号或复选标记,…

小程序排名优化全攻略

随着小程序的快速发展,小程序之间的竞争也日益激烈。如何在竞争对手众多的环境下脱颖而出,通过小程序排名优化来提高曝光率和流量转化率,已成为许多小程序开发者和运营者关注的重点。本文将全面解析小程序排名优化的方法,让您可以更好地提升小程序的搜索排名。 【名即微】 小程…

开目软件携手纷享销客共建CRM平台,数智推动规模化发展

在制造业升级转型、工业化与信息化深度融合的浪潮下&#xff0c;一批提供制造业数字化赋能的工业软件服务商趁势发力&#xff0c;迎来广阔发展空间。 武汉开目信息技术股份有限公司&#xff08;以下简称“开目软件”&#xff09;是中国高端工业软件领导品牌&#xff0c;凭借自…

Hadoop生态圈中的Hive数据仓库技术

Hadoop生态圈中的Hive数据仓库技术 一、Hive数据仓库的基本概念二、Hive的架构组成三、Hive和数据库的区别四、Hive的安装部署五、Hive的基本使用六、Hive的元数据库的配置问题七、Hive的相关配置项八、Hive的基本使用方式1、Hive的命令行客户端的使用2、使用hiveserver2方法操…

如何预防最新的Mallox变种malloxx勒索病毒感染您的计算机?

导言&#xff1a; 在数字时代&#xff0c; .malloxx 勒索病毒的威胁一直悬在我们头上&#xff0c;如何应对这种威胁&#xff0c;以及在数据被勒索后如何恢复它们&#xff0c;都是备受关注的话题。本文91数据恢复将向您介绍 .malloxx 勒索病毒的独特工作方式&#xff0c;提供与众…

APP启动优化Android篇

背景 为什么重提启动优化&#xff1f;首先&#xff0c;用户进入APP唯一的路径就是启动&#xff0c;这是体验核心链路的第一环。启动分为冷启动、热启动和温启动&#xff0c;本文中「启动」一词如果没有特别说明&#xff0c;均为冷启动。启动时间过长&#xff0c;会造成用户流失…

l8-d10 TCP协议是如何实现可靠传输的

一、TCP主要特点 TCP 是面向连接的运输层协议&#xff0c;在无连接的、不可靠的 IP 网络服务基础之上提供可靠交付的服务。为此&#xff0c;在 IP 的数据报服务基础之上&#xff0c;增加了保证可靠性的一系列措施。 TCP主要特点 1.TCP 是面向连接的运输层协议。 每一条 TCP 连…

【侯捷】C++面向对象 (上)

1.C 编程简介 & 目标 培养代码正规编范class 分为 带pointer 和 不带pointer的 学习C &#xff1a; 语言 标准库 2.C vs C C语言 &#xff1a; &#xff08;type&#xff09;数据 函数 —create—》 数据sC &#xff1a; (class ) 数据 成员 —create—》 对象不带指…

【山河送书第十期】:《Python 自动化办公应用大全》参与活动,送书两本!!

【山河送书第十期】&#xff1a;《Python 自动化办公应用大全》参与活动&#xff0c;送书两本&#xff01;&#xff01; 前言一书籍亮点二作者简介三内容简介四购买链接五参与方式六往期赠书回顾 前言 在过去的 5 年里&#xff0c;Python 已经 3 次获得 TIOBE 指数年度大奖&am…

FL Studio 21.1.0官方中文破解版下载安装激活教程重磅发布含注册机

今天带来的是FL Studio 21中文版&#xff0c;内置破解补丁&#xff0c;可以完美激活程序。所有功能均可在线编辑&#xff0c;用户可直接操作。同时&#xff0c;因为FL Studio 21是最新版本&#xff0c;所以增加了新的功能。共有八种乐器和效果器插件&#xff0c;包括效果链、音…

文心一言 VS 讯飞星火 VS chatgpt (89)-- 算法导论8.3 2题

二、用go语言&#xff0c;下面的排序算法中哪些是稳定的&#xff1a;插入排序、归并排序、堆排序和快速排序?给出一个能使任何排序算法都稳定的方法。你所给出的方法带来的额外时间和空间开销是多少&#xff1f; 文心一言&#xff1a; 在Go语言中&#xff0c;以下排序算法是…

mybatis逆向工程的构建及其概念

概念 正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的。 逆向工程&#xff1a;先创建数据库表&#xff0c;由框架负责根据数据库表&#xff0c;反向生成如下资源&#xff1a; Java实体类 Mapper接口 Mapper配…

深度学习基础之梯度下降

1. 引言 梯度下降是一种用于最小化&#xff08;或最大化&#xff09;损失函数的优化算法。它是机器学习和深度学习中的一个关键概念&#xff0c;通常用于调整学习算法中的参数。 梯度下降背后的核心思想是迭代调整参数以最小化损失函数。它的工作原理是计算损失函数相对于每个…

解密外贸邮箱:揭秘其优势与出奇招!

外贸业务需要面对来自全球范围内的客户和供应商&#xff0c;因此&#xff0c;拥有一个高效可靠的通讯工具非常重要。在这方面&#xff0c;外贸邮箱无疑成为了外贸业务中不可或缺的一部分。那么&#xff0c;外贸邮箱有哪些优势呢&#xff1f;在这篇文章中&#xff0c;我们将会全…

【视频图像篇】FastStone Capture屏幕直尺功能设置

【视频图像篇】FastStone Capture屏幕直尺功能设置 FastStone Capture屏幕直尺功能的设置操作说明—【蘇小沐】 文章目录 【视频图像篇】FastStone Capture屏幕直尺功能设置1.实验环境 启动界面自定义工具栏1、直尺路径2、直尺方向、单位、颜色、透明度等3、直尺长度 总结 1.实…

目标检测评估指标mAP:从Precision,Recall,到AP50-95

1. TP, FP, FN, TN True Positive 满足以下三个条件被看做是TP 1. 置信度大于阈值&#xff08;类别有阈值&#xff0c;IoU判断这个bouding box是否合适也有阈值&#xff09; 2. 预测类型与标签类型相匹配&#xff08;类别预测对了&#xff09; 3. 预测的Bouding Box和Ground …

【VS Code插件开发】常见自定义命令(七)

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域优质作者、阿里云专家博主&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4e2; 资料领取&#xff1a;前端…

java包装类简单认识泛型

1 包装类 在 Java 中&#xff0c;由于基本类型不是继承自 Object &#xff0c;为了在泛型代码中可以支持基本类型&#xff0c; Java 给每个基本类型都对应了一个包装 类型。类中比如由属性/方法 使用比较方便 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱 装包/装箱 : …

Linux使用docker安装elasticsearch-head

一、elasticsearch-head的安装启动 #下载镜像 docker pull alivv/elasticsearch-head #启动 docker run -d --name eshead -p 9100:9100 alivv/elasticsearch-head 查看日志 docker logs -f eshead 出现如下证明启动成功 浏览器访问9100端口&#xff0c;出现以下页面也说明…