springMVC 使用统一异常注解拦截@ExceptionHandle遇到的问题解决

项目使用spring框架(spring4.3版本),MVC模式,接口是restful方式,通过json格式进行数据交互,controller层通过注解@ResponseBody返回json数据;
在架构设计中的异常处理是service层及更底层有问题就向上抛异常,Controller层捕获所有异常,为了省去每个方法处理逻辑时try…catch的冗余及代码的复杂性,通过使用springMvc注解@ExceptionHandle统一处理异常。
用法如下:

@RestControllerAdvice // 相当于@Controller 和@ResponseBody 的增强版
@RequestMapping("/common")
public class CommonController extends BaseController {

    @Resource
    private DataWalletService dataWalletService;

    /**
     *获取底色颜色值接口
     */
    @RequestMapping("/backColor")
    public Result backColor(){

        DWConfigRequest dwConfigRequest = new DWConfigRequest();
        dwConfigRequest.setType(SystemConfigTypeEnum.SCORE_BACK_GROUND_COLOR.getCode());
        DWConfigResponse response = dataWalletService.getConfig(dwConfigRequest);
        return Result.buildSuccess(getColor(response.getValue()));
    }
    }
@Slf4j
public class BaseController  {

    @ExceptionHandler
    @ResponseBody
    public Result exception(HttpServletRequest request, HttpServletResponse response, Exception e) {
        log.error("统一处理controller异常");

        if (e instanceof BizException) {//BizException自定义异常
            BizException be = (BizException) e;
            log.error("BaseController.BizException! code:{}, msg:{}",
                    be.getErrorCode(), be.getMessage());
            return new Result(be.getErrorCode(), be.getMessage(), new Object());
        } else {
            log.error("BaseController.Exception! ", e);
            return Result.buildFail(OperateStatus.SERVER_EXCEPTION);
        }

    }
  1. 错误1:

但是使用过程中重复调用了3次RPC远程接口,并且同一个异常被捕获了3次,而且内容是一模一样,非常疑惑,刚开始在代码里打印的是info日志,所以问题没有暴露出来;

在这里插入图片描述

  1. 错误2:

后来通过打印debug日志,发现java.lang.IllegalArgumentException: No converter found for return value of type:…的错误;------此问题是数据类型转换问题;

解决方法:
后来通过打印debug日志,以及通过debug方式跟踪代码的方式,最终找到了原因。
发现问题的罪魁祸首就是在配置文件中多次出现,
根据网上查看资料,原来
配置会自动注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter与ExceptionHandlerExceptionResolver三个bean。
而在我的配置文件不仅配置了2个 ,又配置了1个RequestMappingHandlerAdapter,因此导致问题1:(重复3次调用RPC);因此解决方式是删除多余的配置,只留下1个mvc:annotation-driven配置即可,其中问题2导致的原因是,没有找到合适的类型转换器;所以最后在配置文件中增加了FastJson解决了;

配置spring-mvc.xml中配置如下:

 
    
        
            
                
                    
                        text/plain;charset=UTF-8
                    
                
            
            
            
                
                    
                        text/html;charset=UTF-8
                        application/json;charset=UTF-8
                    
                
            
        
    

其中看过几篇比较好的文章,参考一下:
mvc:annotation-driver

RequestMappingHandlerAdapter配置

跟踪日志

spring mvc使用fastjson视图解析器报错’Content-Type’ cannot contain wildcard type ‘*’

问题的展示及debug:(这部分可忽略)
springMVC 使用统一异常注解拦截@ExceptionHandle遇到的问题解决_第1张图片
springMVC 使用统一异常注解拦截@ExceptionHandle遇到的问题解决_第2张图片
springMVC 使用统一异常注解拦截@ExceptionHandle遇到的问题解决_第3张图片
springMVC 使用统一异常注解拦截@ExceptionHandle遇到的问题解决_第4张图片

你可能感兴趣的:(spring,spring,ExceptionHandle,异常)