项目异常问题解决记录
请求状态码及异常解决方案
状态码 | 异常名 | 具体发生原因 | 常见场景 | 解决方式 |
---|---|---|---|---|
400 | bad request | 前后端参数名、值不匹配 | 后端@RequestMapping(params={})进行了限定,前端传的参数不符合 | |
401 | 权限问题 | |||
403 | 未授权问题 | |||
404 | 资源未找到 | 1.地址错误 | 地址输入错误 | 检查 |
404 | 资源未找到 | 2.后台未向前端有任何输出 | 后端返回void,或使用了responsebody注解但并未配置Jackson解析的依赖 | 视图解析器使用order属性 |
404 | 资源未找到 | 3. 启动类上手动@ComponentScan导致SpringbootApplication中原定义的扫描范围出问题,或者MapperScan等扫描范围出问题,找不到Controller | 去掉手动加上的@ComponentScan | |
404 | 资源未找到 | 4.当前页面资源类型无法被默认视图解析器解析 | jsp和HTML并存的项目 | 视图解析器使用order属性 |
415 | Unsupported Media Type | 前端传递的信息与后台接收信息类型不一致 | 后台使用了@RequestBody注解(接收Json数据)而前端是以form表单提交 | 中间使用Json接收中转一下 删除后端@RequestBody注解 |
415 | Unsupported Media Type | json依赖包问题导致无法解析 | 依赖包导入有问题,更换版本或依赖包 | |
500 | Ambiguous handler methods mapped for ‘XXX’ | 请求的处理器不明确 | 两个处理器的mapping格式和方法类型一样,服务器无法判断当前请求应当使用哪个处理器 | 保证处理器映射的唯一性(对其中一个的path或method进行更改) @RequestMapping(value = “/{name}”,method = RequestMethod.GET) public …{} @RequestMapping(value = “/”,method = RequestMethod.POST) public…{} |
WEB响应
数字 | 原因 | 解决方案 |
---|---|---|
400 | 传递了参数但是无法解析(传参格式问题) | |
401 403 | 权限问题 | |
404 | 资源无法找到(路径等问题) | |
405 | ||
415 | 参数类型不匹配(Json) | |
500 | 代码有问题 | |
请求失败:一直302重定向
配置shiro权限拦截时接口名称写错,导致应该正常访问的login接口一直被拦截重定向
找不到资源:一上来就404
使用的静态页面,没有配置mvc:default-servlet-handler,导致中央处理器将其按照动态资源处理
响应失败:415不支持的类型
- Jackson包导入异常
- 错误使用/未使用requestBody responseBody注解
参数匹配相关异常:400
-
Required List parameter ‘ids’ is not present
后端web层接收时错误使用了@requestparam 或未使用注解前后端传对象: 前端表单+POST提交——属性和字段名一致,controller方法可以直接以对象接收,无需任何注解 前端Json提交——后端需使用@requestBody解析为对象(记得使用解析包)
时间相关
时间少了8小时
数据库和存储时时间显示都正常,查询后渲染到页面时显示少8个小时
是Json解析并渲染到前端时使用的时区问题,pojo原型的Date类型参数上添加注解:@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”,timezone = “GMT+8”),明确时区为GMT+8即可
时间格式转换报错
前端某一属性值为时间字符串,pojo和数据库都是数值类型,故需要在js中进行转换才能成功!否则参数类型错误!
Date.parse(字符串) 转换成日期
日期对象.valueOf() 转换成毫秒值
vm.activity.beginTime = Date.parse(vm.activity.beginTime).valueOf();
vm.activity.endTime = Date.parse(vm.activity.endTime).valueOf();
前端为字符串,实体类和数据库都是用date类型(实体类必须是Util的date不是SQL的date)
方法1,在yml中进行指定格式 spring : mvc : date-format: yyyy-MM-dd
方法2,在实体类添加@DatetimeFormat(pattern=“yyyy-MM-dd”)注解(与方法1效果相同)
以上2个方法,pattern指定严格(年月日时分秒)的话,就只能严格接收这样的类型的字符串;简单指定(年月日)的话,也可以接收带时分秒的,但会损失精度
POJO是date类型,前端需要格式化后展示
在实体类属性上添加@JsonFormat(pattern="yyyy - MM -dd")注解
数据库-时区问题导致页面响应失败
在URL后追加 &serverTimezone=GMT(或在application.yml中配置serverTimezone) 即可
静态页面问题
- Vue vue-router无法渲染
router-link to无法渲染为链接a标签,也无法加载锚点:vue-router.min.js必须紧接着vue.js引用!!
丢失部分数据
属性注入失败
可能存在new的情况,同时使用new和springIOC管理会出错。请保证全程使用IOC
丢失基本类型数据
使用mapper启动器时,实体类属性必须用封装类型存放!基本类型(int,long)会显示为null
含大写字段丢失数据
application.yml中加入mybatis的全局配置(开启驼峰转换):
mybatis:
configuration:
map-underscore-to-camel-case: true
Feign中数据为null或不匹配、报405/500error Creating bean/RequestParam.value() was empty on parameter 0
基本类型,消费端可以取到,服务端取不到:
需在FeignClient 和 所有相关Controller都是用@RequestParam("")注解!必须声明参数名,才能正常传递!!
自定义类型(对象类型),无法从前端获取数据:
必须使用POST传递+@RequestBody注解,前端传输json数据;
Controller返回空数据
Lombok插件失效,某些时候需要打开注解编程并删除target目录后重新编译