我感觉看了这节课,给我的思考还是很多的,感觉受益良多。废话不多说,一起学习。

统一的 外层结构返回

这样利于代码看着也规范,前端处理也统一

# 错误返回
{
"code": 1,
"msg": "未成年禁止入内",
"data": null
} # 正确返回
{
"code": 0,
"msg": "成功",
"data":{
"id": 8,
"name": "maomao",
"age": 19
}
}

(1) 实现这个我们要定义一个返回结果的实体类

package com.imooc.entity;

/**
* http请求做外层对象
* @Auther: curry
* @Date: 2018/6/2 14:35
* @Description:
*/
public class Result<T> { /**
* 状态码
*/
private Integer code; /**
* 提示信息
*/
private String msg; /**
* 返回数据
*/
private T data; //get和set省略
}

(2)定义返回结果的工具类

package com.imooc.utils;

import com.imooc.entity.Result;

/**
* @Auther: curry
* @Date: 2018/6/2 14:39
* @Description:
*/
public class ResultUtil { public static Result success(Object object){
Result result = new Result();
result.setCode(0);
result.setMsg("成功");
result.setData(object);
return result;
} public static Result success(){
return success(null);
}
public static Result error(Integer code,String msg){
Result result = new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
}

(3) 使用规定的返回结果

注意:controller 只是用于请求和参数的传递,业务处理应该在service进行处理。这只是方便演示

    @PostMapping("/girls")
public Result<Girl> girlAdd(@Valid Girl girl, BindingResult bindingResult){
if(bindingResult.hasErrors()){
return ResultUtil.error(1,bindingResult.getFieldError().getDefaultMessage());
}
return ResultUtil.success(girlRepository.save(girl)); }

(4) 这样就使我们返回结果如上面所示的一样了

定义统一的异常处理

实现业务:获取女生的年龄,

如果小于10岁:返回:还在小学

如果大于10岁小于16岁:返回:还在初中

controller层

    @GetMapping(value = "/girls/getAge/{id}")
public void getAge(@PathVariable("id") Integer id) throws Exception {
girlService.getAge(id);
}

service层

@Service
public class GirlService {
@Resource
private GirlRepository girlRepository;
public void getAge(Integer id) throws Exception {
Girl girl = girlRepository.getOne(id);
Integer age = girl.getAge();
if(age<10){
throw new Exception("还在小学");
}else if(age >10 && age< 16){
throw new Exception("还在初中");
} }
}

监听异常

package com.imooc.handle;

import com.imooc.aspect.HttpAspect;
import com.imooc.entity.Result;
import com.imooc.exception.GirlException;
import com.imooc.utils.ResultUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; /**
* @Auther: curry
* @Date: 2018/6/2 15:05
* @Description:
*/
@ControllerAdvice
public class ExceptionHandle {
private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result handle(Exception e){
return ResultUtil.error(100,e.getMessage());
}
}

测试返回结果,控制台不会报错

{
"code": 100,
"msg": "还在初中",
"data": null
}
实现自己的Exception

创建自己的Exception

继承自RuntimeException 是因为 spring 这个框架对运行时异常会进行数据回滚,如果是Exception .则不会

package com.imooc.exception;

import com.imooc.enums.ResultEnum;

/**
* @Auther: curry
* @Date: 2018/6/2 15:30
* @Description:
*/
public class GirlException extends RuntimeException{ private Integer code; // 这里使用了枚举
public GirlException(ResultEnum resultEnum) {
super(resultEnum.getMsg());
this.code = resultEnum.getCode();
} public Integer getCode() {
return code;
} public void setCode(Integer code) {
this.code = code;
}
}

创建枚举类

package com.imooc.enums;

/**
* @Auther: curry
* @Date: 2018/6/2 15:46
* @Description:
*/
public enum ResultEnum {
UNKNOW_ERROR(-1,"未知错误"),
SUCCESS(0,"成功"),
PRIMARY_SCHOOL(100,"还在小学"),
MIDDLE_SCHOOL(101,"还在初中"), ; private Integer code; private String msg; ResultEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
} public Integer getCode() {
return code;
} public String getMsg() {
return msg;
} }

修改异常捕获类

    public Result handle(Exception e){
// return ResultUtil.error(100,e.getMessage()); if (e instanceof GirlException){
GirlException girlException = (GirlException)e;
return ResultUtil.error(girlException.getCode(),girlException.getMessage());
}else {
logger.info("【系统异常】{}",e);
return ResultUtil.error(-1,"未知错误");
}
}

修改service类

    public void getAge(Integer id) throws Exception {
Girl girl = girlRepository.getOne(id);
Integer age = girl.getAge();
if(age<10){
throw new GirlException(ResultEnum.PRIMARY_SCHOOL);
}else if(age >10 && age< 16){
throw new GirlException(ResultEnum.MIDDLE_SCHOOL);
} }

测试

{
"code": 101,
"msg": "还在初中",
"data": null
}

代码下载:github

玩的开心!

最新文章

  1. 【转】Oracle 执行计划(Explain Plan) 说明
  2. Oracle行转列、列转行的Sql语句总结(转)
  3. 程序设计入门——C语言 第2周编程练习 1时间换算(5分)
  4. Notification NotificationManager RemoteViews PendingIntent
  5. 抓包工具PowerSniff-0.1
  6. 【iCore双核心组合是开发板例程】【12个 verilog 中级实验例程发布】
  7. FocusWriter
  8. cell函数总结
  9. oracle dataguard
  10. C++中的unordered_map
  11. jquery弹出层拖拽
  12. python爬虫从入门到放弃(九)之 实例爬取上海高级人民法院网开庭公告数据
  13. jsonp跨域实现
  14. Linux指令--wget
  15. kvm虚拟化2-qemu-kvm
  16. 自学Zabbix3.12.4-动作Action-Operation配置
  17. Java BIO、NIO、AIO 学习
  18. nodejs 将网上的图片下载到本地文件
  19. jdeveloper 恢复默认配置
  20. 还不会做! 树上的gcd 树分治 UOJ33

热门文章

  1. SpringCloud-微服务配置统一管理SpringCloud Config(七)
  2. C语言编译过程以及gcc编译参数
  3. 推荐一个娱乐化学习python的网站
  4. centos7搭建ANT+jmeter+jenkins接口测试自动化环境
  5. 利用workbench对linux/Ubuntu系统中的mysql数据库进行操作
  6. == 和 equals 的区别是什么?
  7. 解决网速慢时maven仓库访问慢
  8. 新特性:postgresql的vacuum漫谈
  9. SICP读书笔记 3.1
  10. ovs源码阅读--元组空间搜索算法