1.定义返回结果模板
public class Result<T> {
/* 状态码 */
private String code;
/* 提示信息 */
private String msg;
/* 返回的数据 */
private T data;
public String getCode() {
return code;
}
public void setCode(String 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;
}
}
2.自定义异常
public class MyException extends RuntimeException{
private static final long serialVersionUID = 7112519404688544220L;
/* 状态码 */
private String code;
public MyException (String code,String msg){
super(msg);
this.code = code;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
3.统一异常处理
@ControllerAdvice
public class ExceptionHandle {
private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
@ExceptionHandler(value=MyException.class)
@ResponseBody
public Result<Object> exceptionHandle(Exception e){
if(e instanceof MyException){
MyException mye = (MyException)e;
return ResultUtil.error(mye.getCode(), mye.getMessage());
}else{
logger.error("【系统异常】{}", e);
return ResultUtil.error("-1", "未知错误");
}
}
}
4.统一结果处理
@ControllerAdvice
public class ResultHandle implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
@SuppressWarnings("unchecked")
@Override
public Object beforeBodyWrite(Object object, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
if(object instanceof Result){
Result<Object> result = (Result<Object>) object;
if(!result.getCode().equals("0")){
return result;
}
}
return ResultUtil.success(object);
}
}
5.测试
util
public class ExceptionUtil {
public static void throwError(String code){
throw new MyException(code,PropertiesUtil.errRes.getString(code));
}
public static void throwError(String code,String message){
throw new MyException(code,message);
}
}
public class PropertiesUtil {
public static PropertyResourceBundle errRes = (PropertyResourceBundle) PropertyResourceBundle.getBundle("properties/error");
}
Controller层
@GetMapping("/girls/{id}")
public Girl girlById(@PathVariable("id")Integer id){
return girlService.girlById(id);
}
Service层
public Girl girlById(Integer id) {
Girl girl = girlRepository.findOne(id);
Integer age = girl.getAge();
if(age < 10){
ExceptionUtil.throwError("100");
}else if(age >=10 && age < 16){
ExceptionUtil.throwError("101");
}
return girl;
}
演示结果: