SpringMVC(四)【SSM 整合、统一结果封装、异常处理、前后台协议联调】(2)

简介: SpringMVC(四)【SSM 整合、统一结果封装、异常处理、前后台协议联调】

SpringMVC(四)【SSM 整合、统一结果封装、异常处理、前后台协议联调】(1)https://developer.aliyun.com/article/1534216

1.5、接口测试

业务层接口测试(Junit)、表现层接口测试(Postman)

1.5.1、业务层接口测试

这里使用 Spring 整合了 Junit:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class BookServiceTest {
 
    @Autowired
    private BookService bookService;
 
    @Test
    public void testGetById(){
        Book book = bookService.getById(1);
        System.out.println(book);
    }
 
    @Test
    public void testGetAll(){
        for(Book book: bookService.getAll())
            System.out.println(book);
    }
}

测试结果:

1.6、表现层数据封装模型

       现在当前端发送请求后返回的数据格式并不一致:

       所以现在我们需要对前后端数据进行整合,统一格式。我们把前端需要接收的数据统一封装到 data 属性中;为了区分不同的操作,还会将操作类型封装到 code 属性中;对于失败的消息还会把后端希望返回的错误信息封装到一个 message(msg)属性中:

所以,以后我们要把需要所有返回给前端的结果进行统一封装,我们定义一个 Result 类:

  • 这个类名和字段可以随便增改

1.6.1、表现层与前端数据传输协议实现

       其实也就是把上一节后端返回给前端的结果类型实现一下,我们需要把这些类型写在 controller 包下,毕竟是和表现层相关的:

1.6.2、Result

package com.lyh.controller;
 
public class Result {
    private Object data; // 数据
    private Integer code;   // 状态码
    private String msg; // 消息
 
    public Result(){}
 
    public Result(Integer code,Object data) {
        this.data = data;
        this.code = code;
    }
 
    public Result(Integer code,Object data, String msg) {
        this.data = data;
        this.code = code;
        this.msg = msg;
    }
 
    public Object getData() {
        return data;
    }
 
    public void setData(Object data) {
        this.data = data;
    }
 
    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;
    }
}

1.6.3、Code

状态类(编码结果为0代表失败,结果为1代表成功,越细越好):

package com.lyh.controller;
 
public class Code {
    public static final Integer SAVE_OK = 20011;
    public static final Integer DELETE_OK = 20021;
    public static final Integer UPDATE_OK = 20031;
    public static final Integer GET_OK = 20041;
 
    public static final Integer SAVE_ERR = 20010;
    public static final Integer DELETE_ERR = 20020;
    public static final Integer UPDATE_ERR = 20030;
    public static final Integer GET_ERR = 20040;
    
}

        定义好了返回给前端的类型后,我们当然要把 BookController 中所有控制器方法的返回值改为 Result 类型:

@RestController
@RequestMapping("/books")
public class BookController {
 
    @Autowired
    private BookService bookService;
 
    @PostMapping
    public Result save(@RequestBody Book book) {
        boolean flag = bookService.save(book);
        return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);
    }
 
    @PutMapping
    public Result update(@RequestBody Book book) {
        boolean flag = bookService.update(book);
        return new Result(flag ? Code.UPDATE_OK:Code.UPDATE_ERR,flag);
    }
 
    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id) {
        boolean flag = bookService.delete(id);
        return new Result(flag ? Code.DELETE_OK:Code.DELETE_ERR,flag);
    }
 
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        Book book = bookService.getById(id);
        Integer code = book != null ? Code.GET_OK:Code.GET_ERR;
        String msg = book != null ? "":"查询失败,请重试!";
        return new Result(code,book,msg);
    }
 
    @GetMapping
    public Result getAll() {
        List<Book> books = bookService.getAll();
        Integer code = books != null ? Code.GET_OK:Code.GET_ERR;
        String msg = books != null ? "":"查询失败,请重试!";
        return new Result(code,books,msg);
    }
 
}

测试:

查询所有书籍:

查询 id=10 的书籍:

       可以看到,现在不管是查询什么内容,成功或失败,返回的结果都是 json 格式,至于返回的 Result 对象有哪些属性,这是我们后端程序员和前端需要商量的。

1.7、异常处理器

       如果我们的后端返回没有问题倒也没事,如果我们后端程序出现了异常,那么将会给前端返回一个 html 页面(404或者500等),所以我们就得处理这种不可避免的异常问题:

1.7.1、常见异常出现的位置及原因

  • 框架内部:使用不合规
  • 数据层:外部服务器故障(访问超时)
  • 业务层:业务逻辑书写错误(下标越界)
  • 表现层(和用户交互的层):数据收集、校验规则导致(不匹配的数据类型)
  • 工具类:工具类不够严谨不够健壮(连接没有及时释放)

问题1:各个层都可能会出现异常,那异常处理代码写到哪一层?

所有的异常均抛出到表现层进行处理

问题2:让表现层处理异常,每个方法都去 try-catch 代码量太大了,怎么办?

:用 AOP 思想解决。

事实是 SpringMVC 帮我们提供了异常处理器,而并不需要我们自己实现:

1.7.2、创建异常处理器

在 controller(表现层)下创建一个异常处理器类:

// 这个类必须被 SpringMVC 加载
@RestControllerAdvice
public class ProjectExceptionAdvice {
    @ExceptionHandler(IndexOutOfBoundsException.class)
    public Result doException(IndexOutOfBoundsException e){
        System.out.println("下标越界异常"+e.getMessage());
        return new Result(666,null,"报错啦");
    }
}
  • 这里的类注解代表使用 REST 风格开发控制器的话用这种注解来进行异常处理,如果不是 REST 风格的话换成 @ControllerAdvice 即可;这里的方法注解 @ExceptionHandler 相当于声明这个方法会把捕获到的哪种异常类传进去 。
  • 这里我们返回的类型同样是 Rsult 类,毕竟是返回给前端的,不然前端得不到返回值会一直等。

测试

异常处理器添加返回值(Result类型)后:

       这样,我们的前端程序媛就可以根据返回值把异常界面做的漂亮一点。

1.7.3、项目异常处理

项目异常分类
  • 业务异常:比如程序员故意发一些错误的请求故意折腾我们的系统,或者老实人发一些不规则的数据比如 age=谢永强
  • 系统异常:比如数据库服务器宕机、服务器炸了
  • 其它异常:文件找不到(未预期到的异常)
项目异常处理方案
  1. 业务异常:发送消息给用户,让它老实点,别瞎弄
  2. 系统异常:安抚用户,然后赶紧告诉运维人员,并记录日志
  3. 其它异常:安抚用户,然后开发人员,并记录日志

SpringMVC(四)【SSM 整合、统一结果封装、异常处理、前后台协议联调】(3)https://developer.aliyun.com/article/1534220

相关文章
|
13天前
|
前端开发 Java 数据库连接
Spring MVC 扩展和SSM框架整合
通过以上步骤,我们可以将Spring MVC扩展并整合到SSM框架中。这个过程包括配置Spring MVC和Spring的核心配置文件,创建控制器、服务层和MyBatis的Mapper接口及映射文件。在实际开发中,可以根据具体业务需求进行进一步的扩展和优化,以构建更加灵活和高效的企业级应用程序。
26 5
|
7月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
9月前
|
缓存 NoSQL Java
在 SSM 架构(Spring + SpringMVC + MyBatis)中,可以通过 Spring 的注解式缓存来实现 Redis 缓存功能
【6月更文挑战第18天】在SSM(Spring+SpringMVC+MyBatis)中集成Redis缓存,涉及以下步骤:添加Spring Boot的`spring-boot-starter-data-redis`依赖;配置Redis连接池(如JedisPoolConfig)和连接工厂;在Service层使用`@Cacheable`注解标记缓存方法,指定缓存名和键生成策略;最后,在主配置类启用缓存注解。通过这些步骤,可以利用Spring的注解实现Redis缓存。
105 2
|
9月前
|
前端开发
SpringMVC(四)【SSM 整合、统一结果封装、异常处理、前后台协议联调】(3)
SpringMVC(四)【SSM 整合、统一结果封装、异常处理、前后台协议联调】
|
1月前
|
存储 Java 关系型数据库
ssm026校园美食交流系统(文档+源码)_kaic
本文介绍了基于Java语言和MySQL数据库的校园美食交流系统的设计与实现。该系统采用B/S架构和SSM框架,旨在提高校园美食信息管理的效率与便捷性。主要内容包括:系统的开发背景、目的及内容;对Java技术、MySQL数据库、B/S结构和SSM框架的介绍;系统分析部分涵盖可行性分析、性能分析和功能需求分析;最后详细描述了系统各功能模块的具体实现,如登录、管理员功能(美食分类管理、用户管理等)和前台首页功能。通过此系统,管理员可以高效管理美食信息,用户也能方便地获取和分享美食资讯,从而提升校园美食交流的管理水平和用户体验。
|
9天前
|
Java 关系型数据库 MySQL
weixin050高校体育场管理系统+ssm(文档+源码)_kaic
本文针对高校体育场管理系统的开发与实现进行详细介绍。随着经济快速发展,人们对手机软件需求增加,高校体育场管理系统应运而生。系统采用JAVA技术、Mysql数据库和SSM框架等成熟技术,通过分析功能需求、可行性及性能,设计出包含管理员、用户和学生角色的功能模块。系统实现用户注册登录、信息管理等功能,简化传统手工统计模式,提高管理效率,满足用户对信息获取的及时性与准确性需求。
weixin050高校体育场管理系统+ssm(文档+源码)_kaic
|
13天前
|
前端开发 Java 关系型数据库
基于ssm的社区物业管理系统,附源码+数据库+论文+任务书
社区物业管理系统采用B/S架构,基于Java语言开发,使用MySQL数据库。系统涵盖个人中心、用户管理、楼盘管理、收费管理、停车登记、报修与投诉管理等功能模块,方便管理员及用户操作。前端采用Vue、HTML、JavaScript等技术,后端使用SSM框架。系统支持远程安装调试,确保顺利运行。提供演示视频和详细文档截图,帮助用户快速上手。
48 17
|
16天前
|
前端开发 Java 关系型数据库
基于ssm的超市会员(积分)管理系统,附源码+数据库+论文,包安装调试
本项目为简单内容浏览和信息处理系统,具备管理员和员工权限。管理员可管理会员、员工、商品及积分记录,员工则负责积分、商品信息和兑换管理。技术框架采用Java编程语言,B/S架构,前端使用Vue+JSP+JavaScript+Css+LayUI,后端为SSM框架,数据库为MySQL。运行环境为Windows,JDK8+Tomcat8.5,非前后端分离的Maven项目。提供演示视频和详细文档,购买后支持免费远程安装调试。
69 19
|
17天前
|
前端开发 JavaScript Java
[Java计算机毕设]基于ssm的OA办公管理系统的设计与实现,附源码+数据库+论文+开题,包安装调试
OA办公管理系统是一款基于Java和SSM框架开发的B/S架构应用,适用于Windows系统。项目包含管理员、项目管理人员和普通用户三种角色,分别负责系统管理、请假审批、图书借阅等日常办公事务。系统使用Vue、HTML、JavaScript、CSS和LayUI构建前端,后端采用SSM框架,数据库为MySQL,共24张表。提供完整演示视频和详细文档截图,支持远程安装调试,确保顺利运行。
59 17
|
15天前
|
前端开发 Java 关系型数据库
基于ssm的网络直播带货管理系统,附源码+数据库+论文
该项目为网络直播带货网站,包含管理员和用户两个角色。管理员可进行主页、个人中心、用户管理、商品分类与信息管理、系统及订单管理;用户可浏览主页、管理个人中心、收藏和订单。系统基于Java开发,采用B/S架构,前端使用Vue、JSP等技术,后端为SSM框架,数据库为MySQL。项目运行环境为Windows,支持JDK8、Tomcat8.5。提供演示视频和详细文档截图。
47 10