记一次knife4j文档请求异常 SyntaxError: Unexpected token ‘<‘, ... is not valid JSON

本文主要是介绍记一次knife4j文档请求异常 SyntaxError: Unexpected token ‘<‘, ... is not valid JSON,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

knife4j页面报错问题定位

前几天开发新接口,开发完成后想使用knife4j测试一下接口功能,突然发现访问页面报错提示:knife4j文档请求异常,但之前运行还是正常的,想想会不会与升级依赖有关系,启动其他微服务发现文档接口访问正常,排除因依赖版本升级导致在线API文档无法使用情况,还是和本服务新增接口有关系。

定位问题

首先f12打开调试台,重新刷新页面,看到console有报错提示
在这里插入图片描述
查看报错提示信息好像是某个返回结构不是json形式,还是有点模糊,于是搜索相关错误信息,并未发现类似问题

查询开源组件issues

于是进入knife4j的开源仓库,找到了一个类似问题,发现有其他同学提过类似问题
开源组件issue地址
https://gitee.com/xiaoym/knife4j/issues/I92QJB
在这里插入图片描述
在这里插入图片描述

大佬给出问题原因可能是:接口响应的内容,不是json,找找你框架自己的原因,于是重新回到自己的接口上面

定位具体有问题的接口

由于项目接口非常多,高达几百个,无法精准定位到时具体哪个接口导致加载页面报错,虽然该问题不影响具体功能,但是遇到问题不解决有种如鲠在喉的感觉。没办法采用笨方法,查看最近新增的Controller,采用折半形式终于找到了产生问题的Controller类,然后采用类似方法继续找到了产生问题的接口

@ApiOperation(value = "业务系统大屏", notes = "业务系统大屏")
@PostMapping(value = "/business/detail", produces = "application/json;charset=UTF-8")public BusinessDetailResults businessLeakDetail(@Valid @RequestBody BusinessDetailCondition condition) throws Exception {return businessDetailService.businessDetail(condition);}
定位根因

对比接口和其他接口定义差不多没有发现啥明显问题,然后进入返回结果BusinessDetailResults类发现类上没有添加@ApiModel怀疑是因为这个问题导致的,于是添加上注解,然后重启服务发现问题仍然没有解决,于是把目光聚集到BusinessDetailCondition类上,进入该类好像也没有啥明显问题

@ApiModel(value = "业务系统查询条件")
public class BusinessDetailCondition extends PageCondition {@ApiModelProperty(value = "区域ID", example = "[1,2,3]")private List<Integer> areaIds;@ApiModelProperty(value = "租户ID", example = "[1,2,3]")private List<Integer> tenantIds;@ApiModelProperty(value = "url集合", example = "['https://baidu.com]'")@NotEmptyprivate List<String> domainList;......
}

当时怀疑难道是因为中括号导致无法解析,于是将三个中括号去除,然后访问在线文档页面发现页面可以正常访问了,是否可以下结论是中括号引起的呢?查看接口的请求实例
在这里插入图片描述

发现本来应该是数组的字段全变成了string类型,想想不应该因为中括号的存在导致api在线文档页面无法访问,于是继续测试发现只有domainList的example在添加[]的情况下会导致页面报错,为什么其他两个不会报错呢,继续查看上面的页面报错信息恍然明白,其他两个字段example中也使用了[],其实是因为字段类型都是Integer类型无需使用双引号包裹,重新将domainList字段描述进行修改

@ApiModelProperty(value = "url集合", example = "[\"https://baidu.com\"]")

重新启动微服务,访问在线文档页面发现恢复正常。最后发现是其他同事在添加描述时候不小心没有对string类型添加双引号包裹导致页面在加载时候解析这个json报错
在这里插入图片描述

总结:

其实上面描述的问题只是一个很小很小的疏忽导致在线接口文档无法访问,还好没有影响到生产环境其他功能。本篇文章也只是记录一下生产过程中的一个小问题的定位和处理过程,但是每个人的情况都不尽相同,希望对您在遇到相同问题时候有一点帮助。回头再看一下报错信息,你会发现其实已经给出了具体提示,只是一开始我们没有理解而已。以此记录一下,希望自己下次可以关注细节
在这里插入图片描述

这篇关于记一次knife4j文档请求异常 SyntaxError: Unexpected token ‘<‘, ... is not valid JSON的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

Python使用python-docx实现自动化处理Word文档

《Python使用python-docx实现自动化处理Word文档》这篇文章主要为大家展示了Python如何通过代码实现段落样式复制,HTML表格转Word表格以及动态生成可定制化模板的功能,感兴趣的... 目录一、引言二、核心功能模块解析1. 段落样式与图片复制2. html表格转Word表格3. 模板生

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

解决Java异常报错:java.nio.channels.UnresolvedAddressException问题

《解决Java异常报错:java.nio.channels.UnresolvedAddressException问题》:本文主要介绍解决Java异常报错:java.nio.channels.Unr... 目录异常含义可能出现的场景1. 错误的 IP 地址格式2. DNS 解析失败3. 未初始化的地址对象解决

python利用backoff实现异常自动重试详解

《python利用backoff实现异常自动重试详解》backoff是一个用于实现重试机制的Python库,通过指数退避或其他策略自动重试失败的操作,下面小编就来和大家详细讲讲如何利用backoff实... 目录1. backoff 库简介2. on_exception 装饰器的原理2.1 核心逻辑2.2

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j