管理后台老项目 SSM 框架,任何请求均返回错误码 500
1. 出现问题
- 管理后台使用:Struts2 + Spring + MyBatis 框架,在某次测试平台重启后,启动成功未抛出异常,但是任何请求均返回错误码 500
2. 解决过程
1. 查看日志
- 首先登录测试平台 Linux 环境,手动调用一次,然后查看调用异常日志
cd 目录
-
tail -f 日志.log
,如果日志量比较大可以使用tail -f 日志.log | grep -C 20 'Exception'
- 发现没有抛出异常
- 然后详细去看调用过程,发现 Action 正常处理了
- 由于问题之前未出现过,因此尝试重启一次,仍未能解决,然后重启上一次分支,仍然是相同问题
2. 猜测配置有问题
- 首先猜测是发布配置问题,这个项目是 Struts2 + Spring + MyBatis 的老框架,使用 war 包 + Tomcat 部署
- 进目录
cd /Java/servers/xxx/conf
,查看 server.xml 配置 - 发现 war 包目录为:
<Context docBase="/xxx/Java/deploy/master"
,对应目录下查看文件是正常的 - 其次觉得是否是响应端口被占用,还是在 server.xml 中查到
<Connector port="9xxx" protocol="HTTP/1.1" connectionTimeout="xxx" redirectPort="8xxx" />
<Connector port="8xxx" protocol="AJP/xxx" redirectPort="xxx" />
- 使用
lsof -i:redirectPort 的值
命令,发现端口未被占用 - 最后尝试改为其他接口,发现任何接口均返回 500,与配置无关
3. 根据架构图确定问题
-
根据添加日志显示,Action 执行没问题,查表也有数据,应该是 Struts2 过程中出现的问题
-
因此根据 struts2 架构
-
应该是过滤器或者拦截器后处理的时候出现的问题
-
代码搜索 struts.xml,发现仅有自定义拦截器
-
<interceptors> <interceptor name="xxxInterceptor" class="XxxInterceptor" />
-
查看拦截器 XxxInterceptor.java 代码,发现日志打印到了其他目录(真坑…)
-
找到对应目录再进行第一步查看日志
-
发现在 Action 获取结果后,拦截器后置代码,发生了类加载异常,具体去看发现是解析从配置中心获取的 Json 错误文章来源:https://www.toymoban.com/news/detail-404749.html
-
至此,问题已经找到,配置中心 Json 被人改错了文章来源地址https://www.toymoban.com/news/detail-404749.html
3. 解决方案
- 将配置改成正确的 Json 格式数据,其次在自定义拦截器业务里加异常捕获与规范日志目录
- 启示:测试环境的配置也要谨慎修改,并且如果发生诡异的异常,可以尝试回顾今天的操作
到了这里,关于管理后台老项目 SSM 框架,任何请求均返回错误码 500的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!