No message available问题解决

news2025/2/24 13:23:39

概述

在EFK日志查询平台断断续续看到若干个应用的报错信息:
在这里插入图片描述
在这里插入图片描述

排查

上述截图里报错的类(省略掉Import语句后):

@Slf4j
@RestController
public class FilterErrorController extends BasicErrorController {
    public FilterErrorController() {
        super(new DefaultErrorAttributes(), new ErrorProperties());
    }

    @Override
    @RequestMapping(produces = {MediaType.APPLICATION_JSON_VALUE})
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL));
        HttpStatus status = getStatus(request);
        // 第35行
        log.error(body.get("message").toString());
        Map<String, Object> responseBody = new HashMap<>(16);
        responseBody.put("code","9000");
        responseBody.put("message","服务器开小差了");
        return new ResponseEntity<>(responseBody, status);
    }

    @Override
    public String getErrorPath() {
        return "error/error";
    }
}

自定义的FilterErrorController继承BasicErrorController,而BasicErrorController则继承AbstractErrorController,继续跟进源码:

public class BasicErrorController extends AbstractErrorController {
}

找到AbstractErrorController.getErrorAttributes()方法:

public abstract class AbstractErrorController implements ErrorController {
    protected Map<String, Object> getErrorAttributes(HttpServletRequest request, boolean includeStackTrace) {
       WebRequest webRequest = new ServletWebRequest(request);
       return this.errorAttributes.getErrorAttributes(webRequest, includeStackTrace);
    }
}

进一步定位到DefaultErrorAttributes.addErrorDetails()

@Order(Integer.MIN_VALUE)
public class DefaultErrorAttributes implements ErrorAttributes, HandlerExceptionResolver, Ordered {
    public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
        Map<String, Object> errorAttributes = new LinkedHashMap();
        errorAttributes.put("timestamp", new Date());
        this.addStatus(errorAttributes, webRequest);
        this.addErrorDetails(errorAttributes, webRequest, includeStackTrace);
        this.addPath(errorAttributes, webRequest);
        return errorAttributes;
    }
    
    private void addErrorDetails(Map<String, Object> errorAttributes, WebRequest webRequest, boolean includeStackTrace) {
        Throwable error = this.getError(webRequest);
        if (error != null) {
            while(true) {
                if (!(error instanceof ServletException) || error.getCause() == null) {
                    if (this.includeException) {
                        errorAttributes.put("exception", error.getClass().getName());
                    }    
                    this.addErrorMessage(errorAttributes, error);
                    if (includeStackTrace) {
                        this.addStackTrace(errorAttributes, error);
                    }
                    break;
                }
                error = ((ServletException)error).getCause();
            }
        }
        Object message = this.getAttribute(webRequest, "javax.servlet.error.message");
        if ((!StringUtils.isEmpty(message) || errorAttributes.get("message") == null) && !(error instanceof BindingResult)) {
            errorAttributes.put("message", StringUtils.isEmpty(message) ? "No message available" : message);
        }
    }    
}

源码是定位到。但是为啥呢?排查无果,搁置一阵子。

后续

后来在本地使用postman调试另一个服务的接口 http://localhost:8099/api/cbs/area/getProvinceList,这个地址URL是从我们一个内部后台管理系统(基于开源管理平台【若依】改造)复制而来,也发生相同的报错:
在这里插入图片描述
控制台打印信息如下:aba-cbs-provider | [http-nio-8099-exec-4] | | ERROR | com.aba.web.controller.FilterErrorController | error | 35 | - No message available

既然本地可以复现,那就好办。

看了下,项目工程里controller层代码的URL并没有前缀/api,为啥在后台管理系统里要加上/api,推测下来是统一化与规范化处理。

postman请求 http://localhost:8099/api/cbs/area/getProvinceList,正常返回。

gateway请求转发?突然想到之前在Apollo看到的几个gateway相关的配置:

spring.cloud.gateway.routes[24].id = aba-cbs-provider
spring.cloud.gateway.routes[24].uri = lb://aba-cbs-provider
spring.cloud.gateway.routes[24].predicates[0] = Path=/api/cbs/**
spring.cloud.gateway.routes[24].filters[0] = StripPrefix=1

其中有些服务有spring.cloud.gateway.routes[24].filters[0] = StripPrefix=1这个配置项,而有些服务则无。

cbs应用添加spring.cloud.gateway.routes[24].filters[0] = StripPrefix=1配置后,再次通过postman请求接口 http://localhost:8099/api/cbs/area/getProvinceList,报错消失!

理论知识

StripPrefix这个Spring Cloud Gateway配置项作用是啥。搜索官方文档,StripPrefix参数表示在将请求发送到下游之前从请求中剥离的路径个数。

spring:
  cloud:
    gateway:
      routes:
        - id: aba-cbs-provider
          uri: http://cbs
          predicates:
          # - Path=/cbs/**
          filters:
            - StripPrefix=1

当通过网关服务向cbs服务发起api/cbs/area/getProvinceList发出请求时,转发到cbs服务的请求变成cbs/area/getProvinceList

StripPrefix=2时,则会从路径URLapi/cbs/area/getProvinceList里去掉2个前缀层级,即得到area/getProvinceList

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

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

相关文章

Pytorch安装与测试

1.Anaconda安装 官方网址:www.anaconda.com 找到anaconda的历史安装版本,我安装的是此版本 一直使用默认安装下来即可 1.1安装下来打开终端&#xff0c;创建python环境 1.2创建完成后 创建完成后&#xff0c;通过pip list发现没有torch 2.pytorch安装 进入pytorch官网:PyTor…

C语言 字符串解析strchr/strrchr/strtok//strtok_r函数使用

在程序中&#xff0c;解析用户输入的参数&#xff08;命令行参数&#xff09;是很常见的操作&#xff0c;本文将讲解C语言中常见的一些解析字符串函数使用方法。 1 strchr 1.1 描述 strchr() 用于查找字符串中的一个字符&#xff0c;并返回该字符在字符串中第一次出现的位置…

【数学知识】一文学会算法中的数学知识(1.1)

目录 一.数论 1.质数 (1)质数的判断 (2)分解质因数&#xff08;数几个质数相乘&#xff09; (3)求1-n的所有质数 2.约数 (1)试除法求所有约数 (2)约数个数和约数之和 (3)最大公约数&#xff08;欧几里得算法 &#xff09; 一.数论 1.质数 在大于1 的整数&#x…

全回显SSRF测试两则

之前遇到可回显SSRF&#xff0c;并没有怎么去深入&#xff0c;可能漏洞点支持file协议更偏向于任意文件读取&#xff0c;不会去思考可回显SSRF的深入利用&#xff1b;直到读了pmiaowu师傅的可回显SSRF直接搭建成了代理进行内网渗透&#xff0c;后面遇到了两个可回显SSRF&#x…

【Kafka】Kafka为什么快?

Kafka之所以快的原因有三个&#xff1a;顺序读写、页缓存、零拷贝。 顺序读写 Kafka依赖磁盘来存储和缓存消息。 在我们的印象中&#xff0c;磁盘的读写速度会比内存的读写速度慢&#xff0c;但这是在随机读写场景下的比较。 实际上&#xff0c;磁盘的顺序读写能力不容小觑&am…

Spring IoC注解开发

Component 组件 Controller 控制器 Service 业务 Repository 仓库 其实他们四个本质都一样&#xff0c;只不过另外三个是Component的别名&#xff0c;在不同层使用容易区分 首先需要加入aop依赖&#xff0c;如果你事先加入spring-context依赖&#xff0c;则会关联加入ao…

亚马逊、temu、速卖通、国际站卖家如何利用好测评补单这张王牌?

大家好我是亚马逊测评珑哥。 现在越来越多的跨境电商平台入局&#xff0c;目前跨境电商平台亚马逊、TEMU、ozon、ebay、wish、lazada、敦煌、shopee、速卖通、poshmark、阿里国际站、沃尔玛、newegg、美客多等跨境平台的卖家都在递增&#xff0c;大家都知道&#xff0c;随着各…

javaEE 初阶 — 第一个 servlet 程序

文章目录 Servlet 是什么第一个 Servlet 程序1 创建项目2 引入依赖3 创建目录结构4 代码编写5 打包程序6 部署7 验证 如何使用 tomcat 插件打包及部署1 什么是插件2 插件的安装3 插件的使用4 可能会出现的问题 Servlet 是什么 Servlet 是一种实现 动态页面 的技术&#xff0c;是…

DataX和MongoDB之间的数据导入导出案例

DataX和MongoDB之间的数据导入导出案例 文章目录DataX和MongoDB之间的数据导入导出案例0. 写在前面1. MongoDB前置知识1.1 基础概念详解1.1.1 数据库1.1.2 集合1.1.3 文档&#xff08;Document&#xff09;2. DataX 导入导出案例2.1 读取 MongoDB 的数据导入到 HDFS2.1.1 编写配…

模板的分离编译

目录 &#xff1a; 1.分离编译概念 2.模板是不支持分离编译的 3.报链接错误的原因 4.如何解决 ----------------------------------------------------------------------------------------------------------------------- 1.分离编译概念 一个程序由若干个源文件共同实现&a…

java版工程项目管理系统源码 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

ava版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…

Eureka单机搭建

Eureka简介 Eureka Spring Cloud Eureka 是Netflix 开发的注册发现组件&#xff0c;本身是一个基于 REST 的服务。提供注册与发现&#xff0c;同时还提供了负载均衡、故障转移等能力 Eureka3个角色 服务中心&#xff0c;服务提供者&#xff0c;服务消费者 Eureka Server&a…

(leetcode C语言)1. 两数之和 9. 回文数

目录 1. 两数之和 思路 代码 9. 回文数 思路 思路1 代码1 思路2 代码2 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只…

设计模式-创建型模式之建造者模式

5. 建造者模式5.1. 模式动机无论是在现实世界中还是在软件系统中&#xff0c;都存在一些复杂的对象&#xff0c;它们拥有多个组成部分&#xff0c;如汽车&#xff0c;它包括车轮、方向盘、发送机等各种部件。而对于大多数用户而言&#xff0c;无须知道这些部件的装配细节&#…

linux系统安装和配置网关

Linux 目前国内 Linux 更多的是应用于服务器上&#xff0c;而桌面操作系统更多使用的是 Windows 安装linux虚拟机 网址 VMware下载网址 点击Workstation 16 Pro for Windows下载 安装CentOS centO下载网址 依次点击 7.6.1810/ isos/ x86_64/ CentOS-7-x86_64…

改善供应商关系的八种方法

与供应商保持良好关系的重要性有很多原因。最重要的是&#xff0c;它使每个人的日常工作更加愉快。它还可以为你获得更好的交易&#xff0c;有助于协作并增强商誉。 但是&#xff0c;每个供应商都是不同的&#xff0c;建立牢固的关系可能很棘手。本文将解释企业如何建立并操持…

TypeScript(十二)模块

目录 引言 d.ts声明文件 declare关键字 全局声明 全局声明方式 全局声明一般用作 函数声明 在.ts中使用declare 外部模块&#xff08;文件模块&#xff09; 模块关键字module 声明模块 模块声明方式 模块通配符 模块导出 模块嵌套 模块的作用域 模块别名 内部…

机器学习:皮尔逊相关系数——影评相关性分析案例

机器学习&#xff1a;皮尔逊相关系数——影评相关性分析案例 文章目录机器学习&#xff1a;皮尔逊相关系数——影评相关性分析案例:rocket:1、皮尔逊相关系数概念及公式:rocket:2、案例代码部分皮尔逊&#xff08;pearson&#xff09;相关系数、 斯皮尔曼&#xff08;spearman&…

vue2 和 vue3 共存

1.共存的前置条件 1.1 之前全局安装的 vue2 或者 vue3 的脚手架进行卸载&#xff0c;使用 npm命令卸载vue2 npm uninstall vue-cli -g 再使用 vue -V 查看版本出现以下提示为卸载完成 vue3卸载要使用命令npm uninstall vue/cli -g 1.2 安装cnpm 在命令行中输入 npm install -…

java面试题(SpringBoot)

SpringBoot 1.什么是SpringBoot&#xff1f;有什么优点&#xff1f; springboot是spring的子项目&#xff0c;是spring组件的一站式解决方案&#xff0c;简化了使用的难度&#xff0c;简省了配置 优点&#xff1a; 容易上手&#xff0c;提升开发效率内置web容器管理第三方工…