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,ResultCode> EXCEPTIONS;   
  //使用builder来构建一个异常类型和错误代码的异常 
    protected static ImmutableMap.Builder,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输入框,并支持修改。