MethodArgumentTypeMismatchException异常捕捉
- 线上bug异常捕捉
- 背景:上线的时候发现一个bug,参数类型定义是一个Long型,但是前端传递过来的参数是一个undefined,导致解析失败。但是查看日志打印只显示类型转换错误(MethodArgumentTypeMismatchException),也不清楚调的是哪个接口.于是调整了一下日志捕捉代码。
private final static String ERROR_MSG = "服务器开小差啦!";
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public ResponseData<Object> methodNotSupportedHandler(HttpRequestMethodNotSupportedException e, HttpServletRequest request) {
log.error("url:{} -> 请求方式不正确:{}", request == null ? null : request.getRequestURL(), e);
return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMessage());
}
@ExceptionHandler(MissingServletRequestParameterException.class)
public ResponseData<Object> paramErrorHandler(Exception e, HttpServletRequest request) {
log.error("url:{} -> 参数异常:{}", request == null ? null : request.getRequestURL(), e);
return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMessage());
}
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
public ResponseData<Object> mismatchErrorHandler(MethodArgumentTypeMismatchException e) {
log.error("参数转换失败,方法:" + Objects.requireNonNull(e.getParameter().getMethod()).getName() + ",参数:" +
e.getName() + ",信息:" + e.getLocalizedMessage());
return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMessage());
}
@ExceptionHandler(BusinessException.class)
public ResponseData<Object> handler(BusinessException e, HttpServletRequest request) {
log.error("url:{} -> 业务异常:{}", request == null ? null : request.getRequestURL(), e);
Optional.ofNullable(request)
.ifPresent(r -> {
TreeMap<String, String> reqMap = new TreeMap<>();
for (Map.Entry<String, String[]> me : r.getParameterMap().entrySet()) {
String key = me.getKey();
String value = me.getValue()[0];
reqMap.put(key, value);
}
log.error("user:{},mate:{},入参:{}",
UserContext.getUserId(), MateContext.getMate(), JSON.toJSONString(reqMap));
}
);
return ResponseData.fail(e.getCode() == null ? ResponseCode.INTERNAL_ERROR.getCode() : e.getCode(), e.getMsg());
}
@ExceptionHandler(ParamException.class)
public ResponseData<Object> handler(ParamException e, HttpServletRequest request) {
log.error("url:{} -> 参数异常:{}", request == null ? null : request.getRequestURL(), e);
Optional.ofNullable(request)
.ifPresent(r -> {
TreeMap<String, String> reqMap = new TreeMap<>();
for (Map.Entry<String, String[]> me : r.getParameterMap().entrySet()) {
String key = me.getKey();
String value = me.getValue()[0];
reqMap.put(key, value);
}
log.error("user:{},mate:{},入参:{}",
UserContext.getUserId(), MateContext.getMate(), JSON.toJSONString(reqMap));
}
);
return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMsg());
}
/**
* 配合Assert使用,香
*
* @param e e
* @param request request
* @return object
*/
@ExceptionHandler({IllegalStateException.class, IllegalArgumentException.class})
public ResponseData<Object> handler(RuntimeException e, HttpServletRequest request) {
log.error("url:{} -> 业务异常:{}", request == null ? null : request.getRequestURL(), e);
return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMessage());
}
@ExceptionHandler
public ResponseData<Object> handler(Exception e, HttpServletRequest request) {
log.error("url:{} -> 错误:{}", request == null ? null : request.getRequestURL(), e);
Optional.ofNullable(request)
.ifPresent(r -> {
TreeMap<String, String> reqMap = new TreeMap<>();
for (Map.Entry<String, String[]> me : r.getParameterMap().entrySet()) {
String key = me.getKey();
String value = me.getValue()[0];
reqMap.put(key, value);
}
log.error("user:{},mate:{},入参:{}",
UserContext.getUserId(), MateContext.getMate(), JSON.toJSONString(reqMap));
}
);
return ResponseData.fail(ResponseCode.INTERNAL_ERROR.getCode(), ERROR_MSG);
}
/**
* body参数
*
* @param e BindException
*/
@ExceptionHandler(BindException.class)
public ResponseData<Object> handlerBindException(BindException e) {
StringBuilder msg = new StringBuilder();
FieldError c = e.getBindingResult().getFieldErrors().get(0);
msg.append(c.getDefaultMessage()).append(":").append(c.getRejectedValue());
return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), msg.toString());
}
/**
* 方法参数
*
* @param e ConstraintViolationException
*/
@ExceptionHandler(ConstraintViolationException.class)
public ResponseData<Object> handlerConstraintViolationException(ConstraintViolationException e) {
StringBuilder msg = new StringBuilder();
ConstraintViolation<?> violation = e.getConstraintViolations().iterator().next();
msg.append(violation.getMessage()).append(":").append(violation.getInvalidValue());
return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), msg.toString());
}
MethodArgumentTypeMismatchException异常捕捉的更多相关文章
- 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
本文转载自 java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...
- Java多线程——<七>多线程的异常捕捉
一.概述 为什么要单独讲多线程的异常捕捉呢?先看个例子: public class ThreadException implements Runnable{ @Override public void ...
- Oracle- 存储过程和异常捕捉
这段时间晚上有时候去打打球,回家看看电视剧,日子一天天过…….学了点ORACLE存储过程基础,作一下备注,以便日后需查阅. 创建无参存储过程 create procedure p_myPro1 is ...
- php错误及异常捕捉
原文:php错误及异常捕捉 在实际开发中,错误及异常捕捉仅仅靠try{}catch()是远远不够的. 所以引用以下几中函数. a) set_error_handler 一般用于捕捉 E_NOTI ...
- android中全局异常捕捉
android中全局异常捕捉 只要写代码就会有bug,但是我们要想办法收集到客户的bug.有第三方bugly或者友盟等可以收集.但是,android原生就提供了有关收集异常的api,所以我们来学习一下 ...
- [iOS]异常捕捉
UncaughtExceptionHandler.h #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interfac ...
- Spring 全局异常捕捉
Spring全局异常捕捉类 注解@ControllerAdvice package com.sicdt.sicsign.web.bill.controller; import org.springfr ...
- 5.全局异常捕捉【从零开始学Spring Boot】
在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 新建一个类GlobalDefaultExceptionHandler, 在class注解上@ControllerAdvice ...
- springboot(四)拦截器和全局异常捕捉
github代码:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service 全部 ...
- SQL Server Try Catch 异常捕捉
SQL Server Try Catch 异常捕捉 背景 今天遇到一个关于try catch 使用比较有意思的问题.如下一段代码: SELECT @@TRANCOUNT AS A BEGIN TRY ...
随机推荐
- 462.Minimum Moves to Equal Array Elements II——LeetCode进阶路
原题链接https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/ 题目描述 Given a non-empty i ...
- css实现居中对齐的几种方式
一般来说居中的话可分为水平居中与垂直居中,以下是我个人总结的几种方式 1.水平居中: inline元素:text-algin:center实现 block元素:margin:auto absolute ...
- Windows平台调试器原理与编写01.调试框架
调试器原理与编写01.调试框架-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 调试框架 调试器最基本功能: 断点,单步 断点分为三类 软件断点 硬件断点 内存断点 ...
- WPF 的Image 控件 设置 Image.Source 的数据源,可能存在跨线程调用的问题。
相信很多WPF 的开发,应该都很多用到 Image 这个控件来显示图片.这个图片的来源可以来自各种各样的方式获取到. 我们的组内白板.批注的扫码的功能也用到这个去生成二维码,生成后,二维码显示不出来, ...
- python3验证手机号码
import redef check_phone_right(self, phone_number): """检测号码是否正确""" pho ...
- python解析xml字符串与xml转json
一.python解析xml字符串from xml.dom.minidom import parseString xml_str=""" <root> < ...
- 让AI操作powershell会发生什么
AI-win11-管理员 (中文) 具体项目:https://github.com/liluoyi666/AI-win11-Administrator.git 项目概述 本项目旨在让大语言模型(LLM ...
- 基于nodejs的本地文件增删改查的工具代码
一.代码封装 这是一个使用node.js实现的对本地文件进行增删改查的工具代码封装,其中代码结尾包含了使用方法示例,具体封装代码如下: // jsonTool.js const fs = requir ...
- java面向切面编程---AOP之环绕通知
package com.xlkh.bigscreen.common.aspect; import com.alibaba.fastjson.JSON; import com.fasterxml.jac ...
- 使用Oracle数据库的递归查询语句生成菜单树
SQL 格式 SELECT * FROM TABLE WHERE [...结果过滤语句] START WITH [...递归开始条件] CONNECT BY PRIOR [...递归执行条件] 查询所 ...