error processing condition on org.springframework(spring error create bean)

发布时间:2024-03-20
本文主要介绍在组织上处理条件时出错 spring框架(spring错误创建b测试 这确实是一个问题 但它不是 这不是我的问题 让 让我们开始分析!伪代码场景还原登录界面 模拟错误报告 @ post mapping( /用户/登录 )公共登录结果登录(@ requestbodylogin请求){抛出新的运行时异常( 模拟登录界面错误和);}然后发布拦截器 如果认证的请求没有携带令牌 或者在redis中找不到与令牌相关的用户 就会抛出异常 公共类userlogininterceptor实现handler interceptor { @ override public boolean prehandle(http servlet request请求 httpservletresponse响应 对象处理程序){ string token = request . get header( token );if(token = = null){抛出新的未经验证的异常( 未经认证或令牌已过期);} else {if (redis get(token)= = null){抛出新的未经验证的异常( 未经认证或令牌已过期);}//...将令牌和用户信息设置为threadlocal}返回true}}拦截器配置@configurationpublic类webconfig实现webmvc configurer { @ override public void add interceptors(interceptorregistry registry){ registry . add interceptor(new userlogininterceptor()) exclude path patterns( /用户/登录 ) .addpath patterns( /* * );}}这个项目是从拦截器获取令牌 去redis查看用户信息 放入threadlocal 由于来自控制器→服务→映射器的请求的线程id是一致的 这样的请求链可以从这个threadlocal中获取当前登录的用户信息 可以看到/us: /: com . yinshan . auth . core . exception . unauthorized exc:未通过认证或令牌已过期 、;: 未授权 、;status;: 401、;tim: 20210922t 14 : 03 : 39.96559500 }当然这个错误信息格式是我自己处理的 这个不重要 重点是我在登录界面报错了500 为什么在拦截器里没有认证就变成了401 调试分析的时候废话少说 直接开始调试 在抛出异常的代码上做一个断点 然后在拦截器里做一个断点结果登录界面按f9后 断点确实到了拦截器 说实话 我当时真的是这个样子 什么?;拦截器发布的这个接口有什么问题?然而 仔细查看调试面板中prehandle方法的请求参数细节会发现一些棘手的问题 图中的箭头指向非常重要的信息:是当前请求的上下文 当普通请求通过拦截器时 在这个上下文中没有请求的分布类型 正常请求的值是request 特别显眼的是 这个请求资源uri根本不是我请求的/user /login 但是一个/error 看到这里你就大致明白了 这个断点到拦截器 不是因为/user/login的请求 而是因为/error的另一个请求 那么这个/错误是怎么产生的呢?由于图中的tomcatembededcontext是嵌入springboot的tomcat中的一个类 所以我猜这个请求应该是springmvc控制器遇到未处理的错误时内部发起的/error请求 也许你会想 没有 ;你没发现问题吗?似乎很快 为什么做了两个小时?因为我;;我是一盘菜!当我在调试时 我没有 我根本不在乎这个参数是什么 但是一步一步地 f8 → f7 → f8 → f7........................................................................................................................................ 我没有 ;直到我最终调试完dispatchservlet 才做出反应 它是怎么转到请求转发的?我终于明白 人是麻木的 查询官方文档真的在springmvc的官方文档里找到了说明 官网说的很清楚 如果异常不是默认异常处理程序处理的 servlet容器会用dispatchservlet调度一个/error请求 也可以自定义/error请求 详情请参考springmvc官方文档 由于特定原因 springmvc的控制器报错后 服务器会发出/error请求 因为我们的拦截器还没有释放这个/error请求 所以会在dispatchservlet中执行这个请求的拦截器(突然想起来两年前我写过一个自定义的springboot异常页面 就是处理的/error请求) 受保护的void do分派(http servlet请求 http servlet响应)抛出异常{//...//判断并执行prehandle() if(!mapped handler . applyprehandle(processed request response)){ return;}以上是dispatchservlet的dodispatch部分的源代码 我相信大多数人 s对dodispatch的了解停留在死记硬背springmvc的实现过程进行采访的时候 其实网上的springmvc执行流程图中有几个关键节点 但是没有 多详细 如果你不 如果你真的没有调试这个有问题的源代码 那么你可能不会 ;我不明白这个问题 解决方案明白了问题的原因 解决方案也很简单 只要从我们的自定义身份验证拦截器中排除/error的拦截 @ override public void add interceptors(interceptorregistry registry){ registry . add interceptor(new userlogininterceptor()) exclude path patterns( /error ).addpath patterns( /* * );谈拦截器其实上述问题很大一部分是因为对拦截器缺乏真正的了解 只知道它可以拦截一个请求 没有研究它在什么阶段拦截 在springmvc中是如何实现的 那么让我们 让我们深入分析拦截器拦截器和过滤器的使用范围 看一下filter接口的源代码 可以发现它在javax.servlet包下 而handlerinterceptor在org . spring framework . web . servlet包下 拦截器是由springmvc实现的 其实只是拦截一个或多个java类的组合 和web应用没有必然联系 这意味着过滤器只能在web应用中使用 而拦截器可以在任何可以使用spring和springmvc的地方使用 比如桌面应用 拦截器和过滤器的执行顺序进程过滤器的执行是通过applicationfilterchain在chain中调用的 dofilter()在请求到达servlet之前 在dofilter()内获得下一个过滤器实例来执行过滤方法 其执行顺序为filter 1→application filter chain . do filter()→filter 2→applicationfilter chain . do filter()→filter 3→......如下图拦截器的执行是请求到达dispatchservlet后 在控制器方法执行前后做的事情 如下图所示 这里的过滤链就是上图 显然 prehandle()是拦截的关键 只是它在请求到达控制器目标方法之前执行 返回true/false 决定是否需要阻止该请求 dodatch中处理拦截器的部分源代码 我们都知道dispatchservlet的dodatch()方法处理所有请求 与拦截器相关的内部代码如下 //执行拦截器 s prehandle()if(!mapped handler . applyprehandle(processed request response)){ return;}mv = ha.handle(processedrequest response mapped handler . gethandler());//反射性地调用控制器目标方法/* * *...省略* */mappedhandler appyposthandle(已处理的请求、响应、mv);//在//控制器 的目标方法被执行//请求完成后 执行拦截器 s after completion()processed request response mapped handler mv dispatch exception);事实上 如果我真的调试了有问题的源代码 我不 根本不需要背springmvc执行过程的面试题~ ~我可以 t把它们背下来 但是从源代码调试过程中 我已经清楚的了解了dispatchservlet在请求转发过程中做了什么 结合前面提到的参数验证神器hibernatevalidator和统一异常处理 我自然明白了springmvc是如何实现请求参数的分析和转换的 结论唐 当你遇到问题时 不要惊慌 源代码调试没有那么难 我觉得看有问题的源代码印象更深刻 我 我到新公司还不到一个月 而我 我带着问题读了几次源代码.....刚好赶上换大版本的技术组件 而且总是有各种奇怪的问题 it 阅读更多关于框架和技术组件的官方文档确实是一个好习惯 不要 ;不要总是局限于一些视频教程 多阅读官方文档 找出组件可能出现的问题及其原因 文章标签:,下面一起看看在组织上处理条件时出错 spring框架(spring错误创建b测试 这确实是一个问题 但它不是 这不是我的问题 让 让我们开始分析!伪代码场景还原登录界面 模拟错误报告 @ post mapping( /用户/登录 )公共登录结果登录(@ requestbodylogin请求){抛出新的运行时异常( 模拟登录界面错误和);}然后发布拦截器 如果认证的请求没有携带令牌 或者在redis中找不到与令牌相关的用户 就会抛出异常 公共类userlogininterceptor实现handler interceptor { @ override public boolean prehandle(http servlet request请求 httpservletresponse响应 对象处理程序){ string token = request . get header( token );if(token = = null){抛出新的未经验证的异常( 未经认证或令牌已过期);} else {if (redis get(token)= = null){抛出新的未经验证的异常( 未经认证或令牌已过期);}//...将令牌和用户信息设置为threadlocal}返回true}}拦截器配置@configurationpublic类webconfig实现webmvc configurer { @ override public void add interceptors(interceptorregistry registry){ registry . add interceptor(new userlogininterceptor()) exclude path patterns( /用户/登录 ) .addpath patterns( /* * );}}这个项目是从拦截器获取令牌 去redis查看用户信息 放入threadlocal 由于来自控制器→服务→映射器的请求的线程id是一致的 这样的请求链可以从这个threadlocal中获取当前登录的用户信息 可以看到/us: /: com . yinshan . auth . core . exception . unauthorized exc:未通过认证或令牌已过期 、;: 未授权 、;status;: 401、;tim: 20210922t 14 : 03 : 39.96559500 }当然这个错误信息格式是我自己处理的 这个不重要 重点是我在登录界面报错了500 为什么在拦截器里没有认证就变成了401 调试分析的时候废话少说 直接开始调试 在抛出异常的代码上做一个断点 然后在拦截器里做一个断点结果登录界面按f9后 断点确实到了拦截器 说实话 我当时真的是这个样子 什么?;拦截器发布的这个接口有什么问题?然而 仔细查看调试面板中prehandle方法的请求参数细节会发现一些棘手的问题 图中的箭头指向非常重要的信息:是当前请求的上下文 当普通请求通过拦截器时 在这个上下文中没有请求的分布类型 正常请求的值是request 特别显眼的是 这个请求资源uri根本不是我请求的/user /login 但是一个/error 看到这里你就大致明白了 这个断点到拦截器 不是因为/user/login的请求 而是因为/error的另一个请求 那么这个/错误是怎么产生的呢?由于图中的tomcatembededcontext是嵌入springboot的tomcat中的一个类 所以我猜这个请求应该是springmvc控制器遇到未处理的错误时内部发起的/error请求 也许你会想 没有 ;你没发现问题吗?似乎很快 为什么做了两个小时?因为我;;我是一盘菜!当我在调试时 我没有 我根本不在乎这个参数是什么 但是一步一步地 f8 → f7 → f8 → f7........................................................................................................................................ 我没有 ;直到我最终调试完dispatchservlet 才做出反应 它是怎么转到请求转发的?我终于明白 人是麻木的 查询官方文档真的在springmvc的官方文档里找到了说明 官网说的很清楚 如果异常不是默认异常处理程序处理的 servlet容器会用dispatchservlet调度一个/error请求 也可以自定义/error请求 详情请参考springmvc官方文档 由于特定原因 springmvc的控制器报错后 服务器会发出/error请求 因为我们的拦截器还没有释放这个/error请求 所以会在dispatchservlet中执行这个请求的拦截器(突然想起来两年前我写过一个自定义的springboot异常页面 就是处理的/error请求) 受保护的void do分派(http servlet请求 http servlet响应)抛出异常{//...//判断并执行prehandle() if(!mapped handler . applyprehandle(processed request response)){ return;}以上是dispatchservlet的dodispatch部分的源代码 我相信大多数人 s对dodispatch的了解停留在死记硬背springmvc的实现过程进行采访的时候 其实网上的springmvc执行流程图中有几个关键节点 但是没有 多详细 如果你不 如果你真的没有调试这个有问题的源代码 那么你可能不会 ;我不明白这个问题 解决方案明白了问题的原因 解决方案也很简单 只要从我们的自定义身份验证拦截器中排除/error的拦截 @ override public void add interceptors(interceptorregistry registry){ registry . add interceptor(new userlogininterceptor()) exclude path patterns( /error ).addpath patterns( /* * );谈拦截器其实上述问题很大一部分是因为对拦截器缺乏真正的了解 只知道它可以拦截一个请求 没有研究它在什么阶段拦截 在springmvc中是如何实现的 那么让我们 让我们深入分析拦截器拦截器和过滤器的使用范围 看一下filter接口的源代码 可以发现它在javax.servlet包下 而handlerinterceptor在org . spring framework . web . servlet包下 拦截器是由springmvc实现的 其实只是拦截一个或多个java类的组合 和web应用没有必然联系 这意味着过滤器只能在web应用中使用 而拦截器可以在任何可以使用spring和springmvc的地方使用 比如桌面应用 拦截器和过滤器的执行顺序进程过滤器的执行是通过applicationfilterchain在chain中调用的 dofilter()在请求到达servlet之前 在dofilter()内获得下一个过滤器实例来执行过滤方法 其执行顺序为filter 1→application filter chain . do filter()→filter 2→applicationfilter chain . do filter()→filter 3→......如下图拦截器的执行是请求到达dispatchservlet后 在控制器方法执行前后做的事情 如下图所示 这里的过滤链就是上图 显然 prehandle()是拦截的关键 只是它在请求到达控制器目标方法之前执行 返回true/false 决定是否需要阻止该请求 dodatch中处理拦截器的部分源代码 我们都知道dispatchservlet的dodatch()方法处理所有请求 与拦截器相关的内部代码如下 //执行拦截器 s prehandle()if(!mapped handler . applyprehandle(processed request response)){ return;}mv = ha.handle(processedrequest response mapped handler . gethandler());//反射性地调用控制器目标方法/* * *...省略* */mappedhandler appyposthandle(已处理的请求、响应、mv);//在//控制器 的目标方法被执行//请求完成后 执行拦截器 s after completion()processed request response mapped handler mv dispatch exception);事实上 如果我真的调试了有问题的源代码 我不 根本不需要背springmvc执行过程的面试题~ ~我可以 t把它们背下来 但是从源代码调试过程中 我已经清楚的了解了dispatchservlet在请求转发过程中做了什么 结合前面提到的参数验证神器hibernatevalidator和统一异常处理 我自然明白了springmvc是如何实现请求参数的分析和转换的 结论唐 当你遇到问题时 不要惊慌 源代码调试没有那么难 我觉得看有问题的源代码印象更深刻 我 我到新公司还不到一个月 而我 我带着问题读了几次源代码.....刚好赶上换大版本的技术组件 而且总是有各种奇怪的问题 it 阅读更多关于框架和技术组件的官方文档确实是一个好习惯 不要 ;不要总是局限于一些视频教程 多阅读官方文档 找出组件可能出现的问题及其原因 文章标签:相关资讯。
了解更多在组织上处理条件时出错 spring框架(spring错误创建b测试 这确实是一个问题 但它不是 这不是我的问题 让 让我们开始分析!伪代码场景还原登录界面 模拟错误报告 @ post mapping( /用户/登录 )公共登录结果登录(@ requestbodylogin请求){抛出新的运行时异常( 模拟登录界面错误和);}然后发布拦截器 如果认证的请求没有携带令牌 或者在redis中找不到与令牌相关的用户 就会抛出异常 公共类userlogininterceptor实现handler interceptor { @ override public boolean prehandle(http servlet request请求 httpservletresponse响应 对象处理程序){ string token = request . get header( token );if(token = = null){抛出新的未经验证的异常( 未经认证或令牌已过期);} else {if (redis get(token)= = null){抛出新的未经验证的异常( 未经认证或令牌已过期);}//...将令牌和用户信息设置为threadlocal}返回true}}拦截器配置@configurationpublic类webconfig实现webmvc configurer { @ override public void add interceptors(interceptorregistry registry){ registry . add interceptor(new userlogininterceptor()) exclude path patterns( /用户/登录 ) .addpath patterns( /* * );}}这个项目是从拦截器获取令牌 去redis查看用户信息 放入threadlocal 由于来自控制器→服务→映射器的请求的线程id是一致的 这样的请求链可以从这个threadlocal中获取当前登录的用户信息 可以看到/us: /: com . yinshan . auth . core . exception . unauthorized exc:未通过认证或令牌已过期 、;: 未授权 、;status;: 401、;tim: 20210922t 14 : 03 : 39.96559500 }当然这个错误信息格式是我自己处理的 这个不重要 重点是我在登录界面报错了500 为什么在拦截器里没有认证就变成了401 调试分析的时候废话少说 直接开始调试 在抛出异常的代码上做一个断点 然后在拦截器里做一个断点结果登录界面按f9后 断点确实到了拦截器 说实话 我当时真的是这个样子 什么?;拦截器发布的这个接口有什么问题?然而 仔细查看调试面板中prehandle方法的请求参数细节会发现一些棘手的问题 图中的箭头指向非常重要的信息:是当前请求的上下文 当普通请求通过拦截器时 在这个上下文中没有请求的分布类型 正常请求的值是request 特别显眼的是 这个请求资源uri根本不是我请求的/user /login 但是一个/error 看到这里你就大致明白了 这个断点到拦截器 不是因为/user/login的请求 而是因为/error的另一个请求 那么这个/错误是怎么产生的呢?由于图中的tomcatembededcontext是嵌入springboot的tomcat中的一个类 所以我猜这个请求应该是springmvc控制器遇到未处理的错误时内部发起的/error请求 也许你会想 没有 ;你没发现问题吗?似乎很快 为什么做了两个小时?因为我;;我是一盘菜!当我在调试时 我没有 我根本不在乎这个参数是什么 但是一步一步地 f8 → f7 → f8 → f7........................................................................................................................................ 我没有 ;直到我最终调试完dispatchservlet 才做出反应 它是怎么转到请求转发的?我终于明白 人是麻木的 查询官方文档真的在springmvc的官方文档里找到了说明 官网说的很清楚 如果异常不是默认异常处理程序处理的 servlet容器会用dispatchservlet调度一个/error请求 也可以自定义/error请求 详情请参考springmvc官方文档 由于特定原因 springmvc的控制器报错后 服务器会发出/error请求 因为我们的拦截器还没有释放这个/error请求 所以会在dispatchservlet中执行这个请求的拦截器(突然想起来两年前我写过一个自定义的springboot异常页面 就是处理的/error请求) 受保护的void do分派(http servlet请求 http servlet响应)抛出异常{//...//判断并执行prehandle() if(!mapped handler . applyprehandle(processed request response)){ return;}以上是dispatchservlet的dodispatch部分的源代码 我相信大多数人 s对dodispatch的了解停留在死记硬背springmvc的实现过程进行采访的时候 其实网上的springmvc执行流程图中有几个关键节点 但是没有 多详细 如果你不 如果你真的没有调试这个有问题的源代码 那么你可能不会 ;我不明白这个问题 解决方案明白了问题的原因 解决方案也很简单 只要从我们的自定义身份验证拦截器中排除/error的拦截 @ override public void add interceptors(interceptorregistry registry){ registry . add interceptor(new userlogininterceptor()) exclude path patterns( /error ).addpath patterns( /* * );谈拦截器其实上述问题很大一部分是因为对拦截器缺乏真正的了解 只知道它可以拦截一个请求 没有研究它在什么阶段拦截 在springmvc中是如何实现的 那么让我们 让我们深入分析拦截器拦截器和过滤器的使用范围 看一下filter接口的源代码 可以发现它在javax.servlet包下 而handlerinterceptor在org . spring framework . web . servlet包下 拦截器是由springmvc实现的 其实只是拦截一个或多个java类的组合 和web应用没有必然联系 这意味着过滤器只能在web应用中使用 而拦截器可以在任何可以使用spring和springmvc的地方使用 比如桌面应用 拦截器和过滤器的执行顺序进程过滤器的执行是通过applicationfilterchain在chain中调用的 dofilter()在请求到达servlet之前 在dofilter()内获得下一个过滤器实例来执行过滤方法 其执行顺序为filter 1→application filter chain . do filter()→filter 2→applicationfilter chain . do filter()→filter 3→......如下图拦截器的执行是请求到达dispatchservlet后 在控制器方法执行前后做的事情 如下图所示 这里的过滤链就是上图 显然 prehandle()是拦截的关键 只是它在请求到达控制器目标方法之前执行 返回true/false 决定是否需要阻止该请求 dodatch中处理拦截器的部分源代码 我们都知道dispatchservlet的dodatch()方法处理所有请求 与拦截器相关的内部代码如下 //执行拦截器 s prehandle()if(!mapped handler . applyprehandle(processed request response)){ return;}mv = ha.handle(processedrequest response mapped handler . gethandler());//反射性地调用控制器目标方法/* * *...省略* */mappedhandler appyposthandle(已处理的请求、响应、mv);//在//控制器 的目标方法被执行//请求完成后 执行拦截器 s after completion()processed request response mapped handler mv dispatch exception);事实上 如果我真的调试了有问题的源代码 我不 根本不需要背springmvc执行过程的面试题~ ~我可以 t把它们背下来 但是从源代码调试过程中 我已经清楚的了解了dispatchservlet在请求转发过程中做了什么 结合前面提到的参数验证神器hibernatevalidator和统一异常处理 我自然明白了springmvc是如何实现请求参数的分析和转换的 结论唐 当你遇到问题时 不要惊慌 源代码调试没有那么难 我觉得看有问题的源代码印象更深刻 我 我到新公司还不到一个月 而我 我带着问题读了几次源代码.....刚好赶上换大版本的技术组件 而且总是有各种奇怪的问题 it 阅读更多关于框架和技术组件的官方文档确实是一个好习惯 不要 ;不要总是局限于一些视频教程 多阅读官方文档 找出组件可能出现的问题及其原因 文章标签:相关内容请关注本站点。
上一个:电脑固态硬盘插上电脑不显示
下一个:茶园基肥

芯明天N61.R5E旋转压电马达用于光阑开关
电脑网卡启动不了怎么办(网卡启动进不了系统)
苹果手机密码忘了怎么解锁不用电脑(以前的苹果手机密码忘了怎么解锁)
苹果六手机版本怎么更新,苹果6怎么更新系统
工程算量如何合理安排顺序?
矮牵牛 ‘黄金时代’系列
刑法抢夺罪是第几条
设计师台式机电脑配置(设计师专用台式机配置2020)
笔记本硬盘不启动怎么回事
观赏桃花细菌性穿孔病防治