這里任務(wù)三點(diǎn)要求
1.是異常統(tǒng)一處理
2.是返回格式必須是json格式
3.打印日志信息
這里首先要明確一點(diǎn)就是程序員在寫代碼時(shí)候肯定沒解決的問題都是
throw newException();進(jìn)行拋出去的只要明確這一點(diǎn)。
第二點(diǎn)就是什么是json格式我們必須清楚
{ error: "system error", code: "0001", msg: "系統(tǒng)錯(cuò)誤" }
第三點(diǎn)要明確知道日志信息如何打印。
這里我先給出具體代碼在進(jìn)行解釋說明
首先我給出json格式如何解決的問題,如果是類返回頁面直接是json格式,但是這里是json類,沒辦法我是通過toString方法直接重新寫了json格式,然后調(diào)用這個(gè)方法,返回解釋json格式了
這里還是提醒一下做統(tǒng)一異常處理的人,我的經(jīng)驗(yàn),統(tǒng)一異常處理并不是處處都可以,就比如過濾器和攔截器,因?yàn)樵谧咴陧?xiàng)目之前,會先走過濾器和攔截器,因?yàn)轫?xiàng)目中的統(tǒng)一異常還沒走,所以統(tǒng)一異常處理是攔截不了,你如果想處理,只能拋出來自己解決。沒辦法
packagecom.zenhome.cloud2cloud.config.Exception;
/**
* Created by Qian on 2017/3/14.
*/
public enumErrorInfos {
SPRINGSERVER_ERROR("0001","system error","系統(tǒng)錯(cuò)誤"),
NULLPOINTER("0002","null pointer","系統(tǒng)錯(cuò)誤"),
NUMBERSINABNORMAL("0003","numbers in abnormal","系統(tǒng)錯(cuò)誤");
privateStringcode;
privateStringmsg;
privateStringerror;
privateErrorInfos(String code, String error, String msg) {
this.error=error;
this.code= code;
this.msg= msg;
}
publicString getCode() {
returncode;
}
publicString getMsg() {
returnmsg;
}
publicString getError() {
returnerror;
}
publicString toString(){
return"{ "+"error: "+"\""+error+"\""+", code: "+"\""+code+"\""+", msg: "+"\""+msg+"\""+" }";
}
}
這里在給出正式解決統(tǒng)一異常處理
新建一個(gè)類GlobalDefaultExceptionHandler,
在class注解上@ControllerAdvice,
在方法上注解上@ExceptionHandler(value = Exception.class),具體代碼如下:staticLoggerlogger= LogManager.getLogger(GlobalExceptionHandler.class.getName());
這句話相當(dāng)于聲明日志信息可以調(diào)用,日志具體信息我在最后會給出
e.getClass().isInstance(NullPointerException.class判斷錯(cuò)誤信息是否一致,一致就打印信息
logger.warn("錯(cuò)誤提示"+e.getMessage());控制臺打印日志錯(cuò)誤信息
String error= ErrorInfos.SPRINGSERVER_ERROR.toString();這就是json格式調(diào)用toString方法
packagecom.zenhome.cloud2cloud.config.Exception;
importorg.apache.logging.log4j.LogManager;
importorg.apache.logging.log4j.Logger;
importorg.springframework.web.bind.annotation.ControllerAdvice;
importorg.springframework.web.bind.annotation.ExceptionHandler;
importorg.springframework.web.bind.annotation.ResponseBody;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
* Created by Qian on 2017/3/13.
*/
@ControllerAdvice
public classGlobalExceptionHandler {
staticLoggerlogger= LogManager.getLogger(GlobalExceptionHandler.class.getName());
@ExceptionHandler(value = Exception.class)
@ResponseBody
publicString jsonErrorHandler(HttpServletRequest req, HttpServletResponse res, Exception e)throwsException {
logger.warn("錯(cuò)誤提示"+e.getMessage());
if(e.getClass().isInstance(NullPointerException.class)){
String error= ErrorInfos.NULLPOINTER.toString();
returnerror;
}else if(e.getClass().isInstance(NumberFormatException.class)){
String error= ErrorInfos.NUMBERSINABNORMAL.toString();
returnerror;
}else{
String error= ErrorInfos.SPRINGSERVER_ERROR.toString();
returnerror;
}
}
}
這里我給出實(shí)體類吧
可以測試的
packagecom.zenhome.cloud2cloud.config.Exception;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
importjava.util.HashMap;
importjava.util.Map;
/**
* 測試錯(cuò)誤能否丟出去統(tǒng)一處理
*/
@RestController
public classControl {
@RequestMapping("/json3")
public voidjson3(intx)throwsException{
Map map =newHashMap();
try{
inta =100/x;
}catch(Exception e) {
throw newException();
}
}
}
最后給出打印日志的具體詳解用法
packagecom.didispace.demo;
importorg.apache.log4j.Level;
importorg.apache.log4j.LogManager;
importorg.apache.log4j.Logger;
/**
* Created by Qian on 2017/3/15.
*/
public classHello {
/* static Logger logger = LogManager.getLogger(Hello.class.getName());*/
/* public boolean hello() {
*//* logger.entry();*//* //trace級別的信息,單獨(dú)列出來是希望你在某個(gè)方法或者程序邏輯開始的時(shí)候調(diào)用,和logger.trace("entry")基本一個(gè)意思
logger.error("Did it again!"); //error級別的信息,參數(shù)就是你輸出的信息
logger.info("我是info信息"); //info級別的信息
logger.debug("我是debug信息");
logger.warn("我是warn信息");
logger.fatal("我是fatal信息");
logger.log(Level.DEBUG, "我是debug信息"); //這個(gè)就是制定Level類型的調(diào)用:誰閑著沒事調(diào)用這個(gè),也不一定哦!
*//* logger.exit();*//* //和entry()對應(yīng)的結(jié)束方法,和logger.trace("exit");一個(gè)意思
return false;
}*/
}