邢台网站改版制作公司/semikron

邢台网站改版制作公司,semikron,web网站开发流程图,设计师网址推荐SpringTask 引起的错误 1. 场景 在使用 SpringBoot 编写后台程序时,当在浏览器页面中发起请求时,MP 自动填充来完成一些字段的填充,例如创建时间、创建人、更新时间、更新人等。但是当编写微信小程序时,由于一些字段无法进行自动…

SpringTask 引起的错误

1. 场景

在使用 SpringBoot 编写后台程序时,当在浏览器页面中发起请求时,MP 自动填充来完成一些字段的填充,例如创建时间、创建人、更新时间、更新人等。但是当编写微信小程序时,由于一些字段无法进行自动填充,例如创建人、更新人等,这时需要进行处理,来区分是否为微信端的请求

private final HttpServletRequest request;// 是否排除路径,排除微信端的路径,不自动填充用户id
private boolean isExclude() {String path = request.getRequestURI();return !path.startsWith("/member");
}// 插入数据时自动填充
@Override
public void insertFill(MetaObject metaObject) {if (isExclude()) {this.strictInsertFill(metaObject, "createBy", String.class, String.valueOf(getLoginUserId()));}this.strictInsertFill(metaObject, "createTime", Date.class, DateUtils.getNowDate());
}// 修改数据时自动填充
@Override
public void updateFill(MetaObject metaObject) {if (isExclude()) {this.setFieldValByName("updateBy", String.valueOf(getLoginUserId()), metaObject);}this.setFieldValByName("updateTime", DateUtils.getNowDate(), metaObject);
}

但是此时,就会产生一个问题:当在浏览器端(后台管理端)使用定时任务时(这里以 SpringTask 举例),就会出现异常


提示 “当前请求并未为 Web 请求”,后来经过层层排查,发现是自动填充处使用了 HttpServletRequest 来获取当前请求详情。

在场景中,isExclude 方法依赖于 HttpServletRequest 对象来获取请求路径。然而,定时任务并不属于 Web 请求的一部分,因此在定时任务执行时,HttpServletRequest 对象不可用,这会导致遇到的 IllegalStateException 异常。

2. 解决方案

为了解决这个问题,可以考虑以下几种方法:

  1. 检查请求是否存在:在 isExclude 方法中添加一个检查,判断 HttpServletRequest 是否为空,如果为空则直接返回 truefalse,具体根据你的业务需求来决定。但这只是避免了异常,并没有真正解决问题,因为定时任务确实不需要根据请求路径来判断是否填充用户信息。
  2. 使用不同的条件来判断是否排除:如果定时任务和微信端请求可以通过其他方式区分开来(比如特定的线程池、特定的任务标识等),你可以考虑使用这些方式来判断,而不是依赖请求路径。
  3. 将用户ID作为参数传递:对于定时任务,你可以在任务触发时直接传递用户ID,而不是在任务内部去获取。这样可以避免对 HttpServletRequest 的依赖。
  4. 使用不同的 MetaObjectHandler 实现:为定时任务创建一个独立的 MetaObjectHandler 实现,这个实现不需要考虑 HttpServletRequest,也不需要调用 isExclude 方法。
  5. 修改定时任务逻辑:在定时任务中,手动填充创建人或更新人字段,而不是依赖 MetaObjectHandler 来自动填充。这样可以确保定时任务在执行时不会调用 isExclude 方法。
  6. 基于任务类型进行判断:在 MetaObjectHandler 类中增加一个字段,用于标识当前操作的类型(比如是定时任务还是 Web 请求),在 insertFillupdateFill 方法中根据这个字段来决定是否执行 isExclude 方法的判断。

3. 修改

这里使用一种很简单的方法,使用 RequestContextHolder.getRequestAttributes() 方法来判断当前线程是否绑定了一个 Web 请求的上下文,这是一种常见的方法来区分 Web 请求和其他非 Web 请求(例如定时任务)的线程上下文。这种方法在 Spring 框架中被广泛用于获取当前请求的相关信息,而不会抛出 No thread-bound request found 这样的异常。

具体来说,在的 isExclude 方法中,通过检查 RequestContextHolder.getRequestAttributes() 返回的结果是否为 null,可以判断当前线程是否在一个 Web 请求的上下文中。如果返回的是 null,说明当前线程不是在一个 Web 请求中,因此可以决定不执行某些依赖于 Web 请求的操作,比如填充 createByupdateBy 字段。

private boolean isExclude() {// 校验是否为 Web 请求,避免非 Web 请求导致 IllegalStateException 异常ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if (attributes != null) {HttpServletRequest request = attributes.getRequest();String path = request.getRequestURI();return !path.startsWith("/member");}return false;
}

以下是一些关键点,帮助更好地理解这种方法:

  1. RequestContextHolder: 这个类提供了对当前请求的访问。通过 getRequestAttributes() 方法,可以获取到当前线程的请求属性。
  2. ServletRequestAttributes: 这是 RequestContextHolder.getRequestAttributes() 返回的对象类型之一,包含了当前请求的相关信息。
  3. 判断是否为 web 请求: 通过检查 RequestContextHolder.getRequestAttributes() 是否返回 null,可以判断当前线程是否在一个 web 请求的上下文中。如果不是 null,则可以安全地获取 HttpServletRequest 并进行相关操作。
  4. ThreadLocal 使用: 尽管在 MyMetaObjectHandler 中没有直接使用 ThreadLocal 来判断是否为 web 请求,但 Spring 框架本身在处理 web 请求时会使用 ThreadLocal 来存储请求的上下文信息。因此,RequestContextHolder.getRequestAttributes() 能够正确地识别当前线程是否为 web 请求线程。

这种方法不仅能够有效地区分 Web 请求和其他请求,还能避免出现 No thread-bound request found 的异常,是一个比较优雅的解决方案。如果有其他特定的需求或场景,也可以考虑自定义 ThreadLocal 变量来标识不同的请求类型,但通常情况下,使用 Spring 提供的 RequestContextHolder 就可以满足大多数需求。

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

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

相关文章

FPGA学习篇——Verilog学习4

1.1 结构语句 结构语句主要是initial语句和always语句,initial 语句它在模块中只执行一次,而always语句则不断重复执行,以下是一个比较好解释的图: (图片来源于知乎博主罗成,画的很好很直观!) 1.1.1 initial语句 ini…

【Linux】【网络】UDP打洞-->不同子网下的客户端和服务器通信(未成功版)

【Linux】【网络】UDP打洞–>不同子网下的客户端和服务器通信(未成功版) 上次说基于UDP的打洞程序改了五版一直没有成功,要写一下问题所在,但是我后续又查询了一些资料,成功实现了,这次先写一下未成功的…

【Python编程】高性能Python Web服务部署架构解析

一、FastAPI 与 Uvicorn/Gunicorn 的协同 1. 开发环境:Uvicorn 直接驱动 作用:Uvicorn 作为 ASGI 服务器,原生支持 FastAPI 的异步特性,提供热重载(--reload)和高效异步请求处理。 启动命令: u…

前端权限流程(基于rbac实现思想)

1. 权限控制 1.1. 实现思想 基于rbac权限控制思想实现,给用户分配角色,给角色分配权限 给用户分配角色业务 注意:上方图片是个示例图,代表给用户分配职位(角色),页面中使用了Element-plus的el- checkbox组件…

软件高级架构师 - 软件工程

补充中 测试 测试类型 静态测试 动态测试 测试阶段 单元测试中,包含性能测试,如下: 集成测试中,包含以下: 维护 遗留系统处置 高水平低价值:采取集成 对于这类系统,采取 集成 的方式&…

python3.13安装教程【2025】python3.13超详细图文教程(包含安装包)

文章目录 前言一、python3.13安装包下载二、Python 3.13安装步骤三、Python3.13验证 前言 本教程将为你详细介绍 Python 3.13 python3.13安装教程,帮助你顺利搭建起 Python 3.13 开发环境,快速投身于 Python 编程的精彩实践中。 一、python3.13安装包下…

【极客时间】浏览器工作原理与实践-2 宏观视角下的浏览器 (6讲) - 2.5 渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?

https://time.geekbang.org/column/article/118205 2.5 渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的? 2.4讲了导航相关的流程,那导航被提交后又会怎么样呢? 就进入了渲染阶段。 这…

CMake学习笔记(一):工程的新建和如何将源文件生成二进制文件

cmake是我们在工作过程中比较常见的一个工具,该系列文章是自己用来学习的笔记。目前只是记录下自己学习cmake的过程中的一些重要的知识点,其是以项目需求为导向并非完整的cmake的学习路线和系统,同样也并非适合所有的人。 1.生成一个可执行文…

重定位(1)

一、重定位 1、对于有强大ROM的板子,他们会将上电后的程序放到指定RAM内存 2、无强大片内ROM的板子,自己编程序让他知道RAM内存指定位置 指定位置:就是链接地址,指定哪里,哪里就被编译好一块内存用来存放上电的程序 …

自由学习记录(41)

代理服务器的核心功能是在客户端(用户设备)和目标服务器(网站/资源服务器)之间充当“中介”,具体过程如下: 代理服务器的工作流程 当客户端希望访问某个网站(比如 example.com)时&…

Linux+apache之 浏览器访问云服务器磁盘的图片,通过tomcat

https://javab.blog.csdn.net/article/details/80580520 安装tomcact 修改添加 <Context docBase"/home/wyp/images" path"/img" debug"0" reloadable"true" />修改完成后保存重启tomcat服务。 测试访问方式&#xff1a;http…

LIUNX学习-线程

线程概念 一个进程需要访的大部分资源&#xff0c;诸如自身的代码、数据、new\malloc的空间数据、命令行参数和环境变量、动态库、甚至是系统调用访问内核代码…都是通过虚拟地址空间来访问的。换而言之&#xff0c;进程地址空间是进程的资源窗口&#xff01;&#xff01;   …

1.Big-endian/ little endian大端对齐、小端对齐

一、大端模式、小端模式的介绍 Little endian&#xff1a;是低位字节排放在内存的低地址端、高位字节排放在内存的高地址端。 Big-endian&#xff1a;是高位字节排放在内存的低地址端、低位字节排放在内存的高地址端。 西门子是大端模式&#xff0c;因为比如 MW100 MB100(高位…

SpringBoot Actuator

SpringBoot Actuator 一、简介二、入门1、依赖2、默认监控指标3、查询监控指标4、全量监控指标 三、Spring Boot Admin1、主要功能2、Admin3、Client4、应用墙5、其他 四、定制化1、定制Health端点2、定制Info端点3、定制Metrics端点4、定制Endpoint端点 一、简介 SpringBoot自…

06 HarmonyOS Next性能优化之LazyForEach 列表渲染基础与实现详解 (一)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 目录 一、代码结构概览二、详细代码解析1. 数据源管理实现2. 数据结构定义3. 优化的列表项组件4. 主列表组件实现 一、代码结构概览 本文将详细解…

vscode 查看3d

目录 1. vscode-3d-preview obj查看ok 2. vscode-obj-viewer 没找到这个插件&#xff1a; 3. 3D Viewer for Vscode 查看obj失败 1. vscode-3d-preview obj查看ok 可以查看obj 显示过程&#xff1a;开始是绿屏&#xff0c;过了1到2秒&#xff0c;后来就正常看了。 2. vsc…

excel 斜向拆分单元格

右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后&#xff0c;你可以开始输入文字。 需要注意的是&#xff0c;文字并不会自动分成上下两行。 为了达到你期望的效果&#xff0c;你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…

家政保洁维修行业有没有必要做小程序?

【家政创业必看】家政行业小程序值得做吗&#xff1f;4大核心优势告诉你&#xff01; 随时随地下单&#xff1a;客户手机一键预约&#xff0c;告别找电话/翻页面的麻烦 品牌专业升级&#xff1a;精美界面服务详情用户评价&#xff0c;打造可信赖形象 营销神器&#xff1…

libcoap在Ubuntu下的编译(基于CMake)

引言 libcoap 是一个开源的轻量级 C 语言库&#xff0c;用于实现 CoAP&#xff08;Constrained Application Protocol&#xff0c;受限应用协议&#xff09;。CoAP 是一种专为资源受限设备设计的轻量级通信协议&#xff0c;适用于物联网&#xff08;IoT&#xff09;和嵌入式系…

VSCode知名主题带毒 安装量900万次

目前微软已经从 Visual Studio Marketplace 中删除非常流行的主题扩展 Material Theme Free 和 Material Theme Icons&#xff0c;微软称这些主题扩展包含恶意代码。 统计显示这些扩展程序的安装总次数近 900 万次&#xff0c;在微软实施删除后现在已安装这些扩展的开发者也会…