项目用到了springboot,本来很高兴,但是项目里什么东西都没有,验证,全局异常这些都需要自己区配置。最近springboot用的还是蛮多的,我还是做事情,把经验发表一下.全局统一的异常,首先异常的返回值和正常返回的返回值应该统一json.返回值的code和msg可以用enum保存起来,controller层的方法抛出异常.下面看代码.
package com.lianrong.system.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; 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; import org.springframework.web.bind.annotation.ResponseStatus; import com.lianrong.system.constants.MessageConstant; import com.lianrong.system.base.SimpleServiceResult; import com.lianrong.system.exception.ServiceException; @ControllerAdvice public class AdviceController { private static final Logger logger = LoggerFactory.getLogger(AdviceController.class); @ExceptionHandler(ServiceException.class) @ResponseBody public SimpleServiceResult handlerException(ServiceException e) { logger.warn("预知异常", e); //SimpleServiceResult jsonResult = new SimpleServiceResult(); //jsonResult.setStatus(false); //jsonResult.addMsg(MessageConstant.E0000_9999, e.getMessage()); return SimpleServiceResult.error500(e.getMessage()); } @ExceptionHandler(HttpMessageNotReadableException.class) @ResponseBody @ResponseStatus(value= HttpStatus.BAD_REQUEST) public SimpleServiceResult handlerException(HttpMessageNotReadableException e) { logger.error("服务器未能理解请求!", e); //SimpleServiceResult jsonResult = new SimpleServiceResult(); //jsonResult.setStatus(false); //jsonResult.addMsg(MessageConstant.E0000_0502, "服务器未能理解请求!"); return SimpleServiceResult.error500("服务器未能理解请求!"); } @ExceptionHandler(Exception.class) @ResponseBody public SimpleServiceResult handlerException(Exception e) { logger.error("运行时异常", e); //SimpleServiceResult jsonResult = new SimpleServiceResult(); //jsonResult.setStatus(false); //jsonResult.addMsg(MessageConstant.E0000_9999, "运行时异常"); return SimpleServiceResult.error500("运行时异常"); } }
package com.lianrong.system.exception; public class ServiceException extends RuntimeException { private static final long serialVersionUID = 1L; public ServiceException(String message) { super(message); } }
package com.imooc.shoptest001.handle; import com.imooc.shoptest001.utils.JsonData; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; /** * 全局异常捕获 */ @ControllerAdvice public class ExceptionHandle { /** * ExceptionHandler 捕获什么异常 * ResponseBody 返回json格式 * @return */ @ExceptionHandler(value = Exception.class) @ResponseBody public JsonData handle(Exception ex){ ex.printStackTrace(); System.out.println(ex.toString()); return JsonData.error500(ex.getMessage()); } }
package com.imooc.shoptest001.utils; public enum JsonDataEnum { ERROR(-1,"失败"), SUCCESS(0,"成功"), ; private Integer code; private String msg; JsonDataEnum(Integer code,String msg){ this.code = code; this.msg = msg; } public Integer getCode() { return code; } public String getMsg() { return msg; } }
package com.imooc.shoptest001.utils; /** * 前台返回json类 */ public class JsonData<T> { /** * 返回状态 */ private boolean status; /** * 错误码/正确码 */ private Integer code; /** * 消息. */ private String msg; /** * 具体的内容. */ private T data; public static JsonData success(String msg,Object data){ JsonData jsonData = new JsonData(); jsonData.setMsg(msg); jsonData.setStatus(true); jsonData.setCode(200); jsonData.setData(data); return jsonData; } public static JsonData ok(){ JsonData jsonData = new JsonData(); jsonData.setStatus(true); jsonData.setCode(200); return jsonData; } public static JsonData error(Integer code,String msg){ JsonData jsonData = new JsonData(); jsonData.setStatus(false); jsonData.setCode(code); jsonData.setMsg(msg); return jsonData; } public static JsonData error500(String msg){ JsonData jsonData = new JsonData(); jsonData.setStatus(false); jsonData.setCode(500); jsonData.setMsg(msg); return jsonData; } public boolean isStatus() { return status; } public void setStatus(boolean status) { this.status = status; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
另外自己写了一个jsonData返回类
package com.lianrong.system.base; import java.io.Serializable; import java.util.HashMap; import java.util.Map; /** * 返回json的工具类. */ public class JsonData implements Serializable { private static final long serialVersionUID = -1140504575505840707L; /** * 请求结果正不正常. */ private boolean status; /** * 消息. */ private String msg; /** * 返回码 */ private int code; /** * 数据: */ private Object data; public JsonData(boolean status){ this.status = status; } public JsonData(boolean status,int code){ this.status = status; } public static JsonData success(Object object,String msg){ JsonData jsondata = new JsonData(true); jsondata.data = object; jsondata.code = 200; jsondata.msg = msg; return jsondata; } public static JsonData success(Object object){ JsonData jsondata = new JsonData(true); jsondata.data = object; jsondata.code = 200; return jsondata; } public static JsonData success(){ return new JsonData(true,200); } public static JsonData error(String msg){ JsonData jsondata = new JsonData(false); jsondata.msg = msg; return jsondata; } public static JsonData error500(String msg){ JsonData jsondata = new JsonData(false); jsondata.code = 500; jsondata.msg = msg+",请求未完成。服务器遇到不可预知的情况。"; return jsondata; } public static JsonData error501(String msg){ JsonData jsondata = new JsonData(false); jsondata.code = 501; jsondata.msg = msg+",请求未完成。服务器不支持所请求的功能。"; return jsondata; } public static JsonData error502(String msg){ JsonData jsondata = new JsonData(false); jsondata.code = 502; jsondata.msg = msg+",请求未完成。服务器从上游服务器收到一个无效的响应。"; return jsondata; } public static JsonData error503(String msg){ JsonData jsondata = new JsonData(false); jsondata.code = 503; jsondata.msg = msg+",请求未完成。服务器临时过载或当机。"; return jsondata; } public static JsonData error504(String msg){ JsonData jsondata = new JsonData(false); jsondata.code = 504; jsondata.msg = msg+",网关超时。"; return jsondata; } public static JsonData error401(String msg){ JsonData jsondata = new JsonData(false); jsondata.code = 401; jsondata.msg = msg+",被请求的页面需要用户名和密码。"; return jsondata; } public static JsonData error402(String msg){ JsonData jsondata = new JsonData(false); jsondata.code = 402; jsondata.msg = msg+",此代码尚无法使用。"; return jsondata; } public static JsonData error403(String msg){ JsonData jsondata = new JsonData(false); jsondata.code = 403; jsondata.msg = msg+",对被请求页面的访问被禁止。"; return jsondata; } public static JsonData error404(String msg){ JsonData jsondata = new JsonData(false); jsondata.code = 404; jsondata.msg = msg+",服务器无法找到被请求的页面。"; return jsondata; } public static JsonData error406(String msg){ JsonData jsondata = new JsonData(false); jsondata.code = 406; jsondata.msg = msg+",服务器生成的响应无法被客户端所接受。"; return jsondata; } public static JsonData error505(String msg){ JsonData jsondata = new JsonData(false); jsondata.code = 505; jsondata.msg = msg+",服务器不支持请求中指明的HTTP协议版本。"; return jsondata; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public boolean isStatus() { return status; } public void setStatus(boolean status) { this.status = status; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public Map<String,Object> toMap(){ HashMap<String,Object> result = new HashMap<String,Object>(); result.put("status",status); result.put("msg",msg); result.put("code",code); result.put("data",data); return result; } }