5.4 不可预知异常处理 5.4.1 定义异常捕获方法 5.4.1.1 异常抛出测试 使用postman测试添加页面,不输入cmsPost信息,提交,报错信息如下:

org.springframework.http.converter.HttpMessageNotReadableException 此异常是springMVC在进行参数转换时报的错误。

具体的响应的信息为:

{ 
   "timestamp": 1528712906727, 
   "status": 400,  
  "error": "Bad Request",   
 "exception": "org.springframework.http.converter.HttpMessageNotReadableException",  
  "message": "Required request body is missing: public  com.xuecheng.framework.domain.cms.response.CmsPageResult  com.xuecheng.manage_cms.web.controller.CmsPageController.add(com.xuecheng.framework.domain.cms.C msPage)",   
 "path": "/cms/page/add"
}

上边的响应信息在客户端是无法解析的。 在异常捕获类中添加对Exception异常的捕获:

@ExceptionHandler(Exception.class) @ResponseBody public ResponseResult exception(Exception exception){  
  //记录日志  
   LOGGER.error("catch exception:{}",exception.getMessage());    
   return null; 
}

5.4.1.2 异常捕获方法 针对上边的问题其解决方案是: 1、我们在map中配置HttpMessageNotReadableException和错误代码。 2、在异常捕获类中对Exception异常进行捕获,并从map中获取异常类型对应的错误代码,如果存在错误代码则返 回此错误,否则统一返回99999错误。 具体的开发实现如下: 1、在通用错误代码类CommCode中配置非法参数异常


INVALID_PARAM(false,10003,"非法参数!"),

2、在异常捕获类中配置 HttpMessageNotReadableException 为非法参数异常。 异常捕获类代码如下:

package com.xuecheng.framework.exception;  
 import com.google.common.collect.ImmutableMap;
import com.xuecheng.framework.model.response.CommonCode; 
import com.xuecheng.framework.model.response.ResponseResult; 
import com.xuecheng.framework.model.response.ResultCode; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.http.converter.HttpMessageNotReadableException;
 import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody;  
   /**  * @author Administrator  * @version 1.0  * @create 2018‐06‐11 17:16  **/ @ControllerAdvice public class ExceptionCatch {     private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class);   
    //使用EXCEPTIONS存放异常类型和错误代码的映射,ImmutableMap的特点的一旦创建不可改变,并且线程安全     private static ImmutableMap<Class<? extends Throwable>,ResultCode> EXCEPTIONS;   
  //使用builder来构建一个异常类型和错误代码的异常 
    protected static ImmutableMap.Builder<Class<? extends Throwable>,ResultCode> builder =  ImmutableMap.builder();    
   //捕获Exception异常  
   @ResponseBody   
  @ExceptionHandler(Exception.class)  
  public ResponseResult exception(Exception e) {   
     LOGGER.error("catch exception : {}\r\nexception: ",e.getMessage(), e);    
     if(EXCEPTIONS == null)      
      EXCEPTIONS = builder.build();   
      final ResultCode resultCode = EXCEPTIONS.get(e.getClass());     
    final ResponseResult responseResult;     
    if (resultCode != null) {     
       responseResult = new ResponseResult(resultCode);    
     } else {     
       responseResult = new ResponseResult(CommonCode.SERVER_ERROR);    
     }     
   return responseResult;    
 }    
  //捕获 CustomException异常 
    @ExceptionHandler(CustomException.class)  
  @ResponseBody   
  public ResponseResult customException(CustomException e) { 
       LOGGER.error("catch exception : {}\r\nexception: ",e.getMessage(), e);    
     ResultCode resultCode = e.getResultCode();    
     ResponseResult responseResult = new ResponseResult(resultCode);     
      return responseResult;
    }


static{  
      //在这里加入一些基础的异常类型判断    
     builder.put(HttpMessageNotReadableException.class,CommonCode.INVALIDPARAM); 
    }
}

5.4.3 异常处理测试 仍然模拟“问题测试”中的测试步骤,异常结果为“非法参数”。 6 实战 此部分为自学内容,根据今天所学知识完成下边的任务。 6.1 查询条件完善 页面查询条件增加:页面名称、页面类型。 页面名称对应CmsPage模型类中的pageName属性。 页面类型对应CmsPage模型类中的pageType属性。 查询要求: 页面名称:模糊查询 页面类型:精确匹配,页面类型包括:静态和动态,在数据库中静态用“0”表示,动态用“1”表示。 6.2 页面属性增加DataUrl 在CmsPage.java模型类型中有一个dataUrl属性,此属性在页面静态化时需要填写。 本需求要求: 1、在新增页面增加dataUrl输入框,并支持添加。 2、在修改页面增加dataUrl输入框,并支持修改。