异常解析报错:java.lang.IllegalStateException: Could not resolve parameter [0] in public com.xx.xx com.xx.xx.handler.GlobalExceptionHandler.error(com.fasterxml.jackson.core.JsonParseException): No suitable resolver:
在项目中编写一个异常处理类,进行测试时,进入异常处理方法时却报错,报错如下:
下面贴出该异常处理类:
import com.fasterxml.jackson.core.JsonParseException;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.jdbc.BadSqlGrammarException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 统一异常处理类
*/
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public R error(Exception e){
e.printStackTrace();
System.err.println("发生异常");
return R.error();
}
@ExceptionHandler(BadSqlGrammarException.class)
@ResponseBody
public R error(BadSqlGrammarException e){
//e.printStackTrace();
System.err.println("sql语法错误");
return R.setResult(ResultCodeEnum.BAD_SQL_GRAMMAR);
}
@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseBody
public R error(JsonParseException e){
//e.printStackTrace();
System.err.println("json解析异常");
return R.setResult(ResultCodeEnum.JSON_PARSE_ERROR);
}
// @ExceptionHandler(HttpMessageNotReadableException.class)
// @ResponseBody
// public R error(IllegalStateException e){
// //e.printStackTrace();
// System.err.println("未知异常");
// return R.setResult(ResultCodeEnum.JSON_PARSE_ERROR);
// }
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
@ApiModel(value = "全局统一返回结果")
public class R {
@ApiModelProperty(value = "是否成功")
private Boolean success;
@ApiModelProperty(value = "返回码")
private Integer code;
@ApiModelProperty(value = "返回消息")
private String message;
@ApiModelProperty(value = "返回数据")
private Map<String, Object> data = new HashMap<String, Object>();
private R(){}
public static R ok(){
R r = new R();
r.setSuccess(ResultCodeEnum.SUCCESS.getSuccess());
r.setCode(ResultCodeEnum.SUCCESS.getCode());
r.setMessage(ResultCodeEnum.SUCCESS.getMessage());
return r;
}
public static R error(){
R r = new R();
r.setSuccess(ResultCodeEnum.UNKNOWN_REASON.getSuccess());
r.setCode(ResultCodeEnum.UNKNOWN_REASON.getCode());
r.setMessage(ResultCodeEnum.UNKNOWN_REASON.getMessage());
return r;
}
public static R setResult(ResultCodeEnum resultCodeEnum){
R r = new R();
r.setSuccess(resultCodeEnum.getSuccess());
r.setCode(resultCodeEnum.getCode());
r.setMessage(resultCodeEnum.getMessage());
return r;
}
public R success(Boolean success){
this.setSuccess(success);
return this;
}
public R message(String message){
this.setMessage(message);
return this;
}
public R code(Integer code){
this.setCode(code);
return this;
}
public R data(String key, Object value){
this.data.put(key, value);
return this;
}
public R data(Map<String, Object> map){
this.setData(map);
return this;
}
}
其中resultCodeEnum为自定义的异常枚举;
首先我在前端(swagger测试)故意输入了错误的json数据类型(gmtCreate为日期类型,故意输入String类型):
如果解析报错如上图。
注释掉该异常解析方法,再次运行,由于该异常解析方法没有了,会进入异常解析的父类,即:
@ExceptionHandler(Exception.class)
@ResponseBody
public R error(Exception e){
e.printStackTrace();
System.err.println("发生异常");
return R.error();
}
由此可以发现,可能是异常解析器不能解析异常而导致的报错,而HttpMessageNotReadableException类又获取到了json错误的异常,说明异常解析类并未有问题,而HttpMessageNotReadableException类却无法解析JsonParseException类,说明JsonParseException类不能被HttpMessageNotReadableException类解析,或者说,JsonParseException类并未实现HttpMessageNotReadableException类,所以,解决方案:
1、将JsonParseException类换成HttpMessageNotReadableException类。
2、找到HttpMessageNotReadableException类下实现的json错误解析异常类替换JsonParseException类