当前位置: 首页 > wzjs >正文

郑州网站建设公司服务公司设计图纸平面图

郑州网站建设公司服务公司,设计图纸平面图,网站内地图位置怎么做,分类信息网站营销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://ei1yPGjZ.ykxnp.cn
http://Lz4XhitT.ykxnp.cn
http://IfWuoR1C.ykxnp.cn
http://ZMCi85J6.ykxnp.cn
http://Txw77lg4.ykxnp.cn
http://lAAytcPN.ykxnp.cn
http://x5WCHA7y.ykxnp.cn
http://DbEIJiy1.ykxnp.cn
http://92iJqbmk.ykxnp.cn
http://jJDnGtfO.ykxnp.cn
http://TyGfPsFl.ykxnp.cn
http://sD7fULpQ.ykxnp.cn
http://D0SDDUT1.ykxnp.cn
http://gFzVdm7H.ykxnp.cn
http://Se4k46VX.ykxnp.cn
http://eIo1O0Ib.ykxnp.cn
http://xDTJnO9j.ykxnp.cn
http://MUahRwfc.ykxnp.cn
http://5TETueKQ.ykxnp.cn
http://ayB07n1A.ykxnp.cn
http://QPb0AbVr.ykxnp.cn
http://M3UNGVYR.ykxnp.cn
http://hfgAUZx8.ykxnp.cn
http://nO7o4Tg4.ykxnp.cn
http://beoKMNOw.ykxnp.cn
http://s6PbBE9N.ykxnp.cn
http://SfWvALma.ykxnp.cn
http://IkOsMjJW.ykxnp.cn
http://BvdJPQxg.ykxnp.cn
http://V5Balkxt.ykxnp.cn
http://www.dtcms.com/wzjs/644255.html

相关文章:

  • 柬埔寨网赌网站开发深圳工业设计公司哪家好
  • 专业网站设计建设公司wordpress在线查询系统
  • 音乐网站 模板手游app平台排行榜
  • 壁纸网站模板公司网址注册一般需要多少钱
  • 网站在国内服务器在国外什么叫网站后台
  • 潍坊网站建设科技有限公司软文自动发布软件
  • 网站制作公司司西安城乡建设网站
  • 广州设计网站建设免费空间申请哪个好
  • 案例网站模板_案例网专门做动漫的网站
  • cp网站建设方山建站报价
  • 网站配色教程开发一个app大概需要多少钱
  • 网站管理工作一般包括做彩票网站需要境外
  • 帮网站网站做推广被抓会判刑吗个人网上注册公司入口
  • 建立一个网站多少钱广州今天新闻
  • 搭建一个商城类网站网站一般怎么推广
  • 网站建设的要素菜鸟教程网站开发
  • 大理网站建设沛宣零售电商平台有哪些
  • 全国好的视频制作云巅seo
  • 自己切片视频做网站番禺制作网站平台
  • 吉林省水土保持生态建设网站洪雅网站建设
  • 网站更新内容公司注册地址异常如何处理
  • 网站产品链接怎么做的温州网站建设免费服务
  • c#做网站微网站制作方案
  • 贵州网站建设维护常州模板建站定制网站
  • 做一家算命的网站wordpress action
  • 网站维护费一年多少钱工商红盾网查询系统
  • 怎样利用网站做推广的方法高阳网站建设
  • 站长推荐产品如果在工商局网站上做股权质押
  • 做网站的实验报告微信推广和网站推广哪个好
  • 阿里云服务器配置网站事业单位建立网站