从零开始的SpringBoot前后端分离入门级项目(二)

正文

上回我们已经将项目创建好并且引入了本次项目所需要用到的依赖,这次我们就正式进入项目的编写

编写启动类及配置文件

启动类

在java文件夹下新建两级目录并创建MainApplication.class
目录

启动类
按照上述步骤创建并编写完启动类后就可以开始配置文件的创建了。

配置文件

在resources目录下创建application.yml作为SpringBoot的配置文件

server:
  port: 8090 #监听端口为8090
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource #配置数据库连接池为Druid
    driver-class-name: com.mysql.cj.jdbc.Driver  #配置数据库
    username: 数据库用户名
    password: 数据库登录密码
    url: jdbc:mysql://127.0.0.1:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

请注意对齐,以免发生错误。

启动测试

完成上述两个步骤后一个最简易的SpringBoot项目就搭建完成了!这时我们右键主启动类直接启动项目看见如下图所示,就已经成功在8090端口启动了我们的SpringBoot项目了
在这里插入图片描述

搭建项目的基本框架

在完成启动测试之后我们将整个项目停止,并继续完善我们项目的骨架,熟悉JavaEE的同学都知道在一个JavaWeb项目中主要有下图所示的几个包
项目骨架
注意:请将这些包与主启动类平级创建,以免后面SpringBoot无法扫描到相应的包。
不同包的作用就不在此赘述,接下来我们将从统一请求返回体开始进行项目的编写。

统一请求返回体(统一请求响应体)

目前Web项目一般是采用前后端分离的架构,使用Json格式数据作为前后端沟通的桥梁,那么我们在每次响应请求时都需要返回一个Json格式的数据给前端,如果每次手动拼接数据会产生很多冗余代码于是我们利用一个统一的返回对象对返回格式进行统一。在model包下新建bean包并创建CommonResult类,类中的代码如下

CommonResult

/**
 * @author Alfalfa99
 * @Date 2020/9/13 14:00
 * @Version 1.0
 * 统一请求返回体
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> {
    private Integer code;
    private String message;
    private T data;
}

为了减少重复的get/set方法,我们使用了Lombok中的 @Data @AllArgsConstructor @NoArgsConstructor三个注解帮助我们自动生成get/set方法以及全参/无参构造方法。
注意:如果适用的旧版的idea请注意升级到较新版本的idea,以免idea中的Lombok插件过久出错,如果是第一次使用Lombok请前往idea中的插件市场搜索并下载Lombok插件,以免运行时出错。
那么我们的统一请求返回体就已经编写完毕了,类中有三个字段

  1. Code:用于向前端返回约定好的状态码
  2. message:用于向前端返回一个消息
  3. data:用于向前端返回真正需要的数据

接下来我们需要做两件事情,一件事情是约定好状态码,另一件事情是编写分页结果类。

约定状态码

通常而言HTTP请求有常用状态码如200 OK,404 Not Found 等错误,但是这在开发中常常不足以满足我们的全部需求,于是我们需要自定义所需的状态码

  1. 20000:表示一切正常
  2. 40000-4xxxx:表示程序出现如用户未登录等问题
  3. 50000:表示程序出现预料外的错误,这时候应该记录到服务器日志
    这部分内容将会在后面的全局异常处理类中详细讲述。

分页结果类

在上文中我们说到了统一请求返回体CommonResult ,但是在实际编写代码时我们会遇到一些问题,比如说对搜索结果进行分页,前端就要求我们返回结果总数和分页的数量以及当前页的结果,那这个时候我们只使用一个data字段是无法完成这样的需求的,所以我们需要将其封装成一个分页结果类PageResult。在bean包中新建PageResult类,类中代码如下

/**
 * @Author Alfalfa99
 * @Date 2020/9/17 11:02
 * @Version 1.0
 * 分页返回类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult <T> {
    private long pages;
    private long total;
    private List<T> rows;
}

在分页结果类中我们同样使用了Lombok,在这里就不在赘述了,我们将分页数,结果总数以及当前页的数据作为字段在查询出结果之后先包装到PageResult中再将PageResult包装到上文所述的CommonResult中,由此我们的分页结果类就完成了。

全局异常处理类

在一个Web项目运行时总会出现各种各样的异常,出现异常时我们应该根据异常的等级对其进行日志记录,常用的工具有log4j,slf4j等,在本项目中就不对日志记录进行详细的讲解也不去进行错误的记录,仅将其抛出到前端并由前端对用户进行展示。
言归正传,在初学JavaSE时出现了异常我们常常将其打印到控制台,但是在Web项目中如果直接将错误信息输出到用户浏览器将是非常不明智且不美观的,由此我们利用Spring框架中自带的一个注解@RestControllerAdvice进行全局异常的处理。

GlobalException

首先我们在与主启动类同级的目录下创建一个新的包exception,并在包中创建一个名为GlobalException的全局异常处理类。
在这里插入图片描述
类中的内容为:

/**
 * @Author Alfalfa99
 * @Date 2020/9/13 13:59
 * @Version 1.0
 * 全局异常处理类
 */
@RestControllerAdvice
public class GlobalException {

    /**
     * 捕获所有(Exception.class)中的异常并通过下面的方法返回
     *
     * @param e 错误类型
     * @return 给前端返回报错信息
     */
    @ExceptionHandler(value = Exception.class)
    public CommonResult<String> toHandlerException(Exception e) {
        //开发模式下将错误信息打印到控制台便与调试
        e.printStackTrace();
        if (e instanceof MethodArgumentNotValidException) {
            //参数验证错误
            return new CommonResult<>(40001, "Error", "参数验证错误");
        } else if (e instanceof HttpRequestMethodNotSupportedException) {
            //请求方法有误
            return new CommonResult<>(40002, "ERROR", "错误的请求方法");
        } else if (e instanceof HttpMessageNotReadableException) {
            //请求体错误
            return new CommonResult<>(40003, "ERROR", "错误的请求体");
        } else if (e instanceof IllegalArgumentException) {
            //错误的参数
            return new CommonResult<>(40004, "ERROR", "错误的请求参数");
        } else if (e instanceof AccessDeniedException) {
            //用户权限不足
            return new CommonResult<>(40005, "Error", e.getMessage());
        } else if (e instanceof BadCredentialsException) {
            //Token令牌过期
            return new CommonResult<>(40010, "Error", e.getMessage());
        } else if (e instanceof InternalAuthenticationServiceException) {
            //用户名或密码错误
            return new CommonResult<>(40011, "Error", e.getMessage());
        } else if (e instanceof DisabledException) {
            //账号被封禁
            return new CommonResult<>(40012, "Error", e.getMessage());
        } else if (e instanceof AuthenticationCredentialsNotFoundException) {
            //用户未登录
            return new CommonResult<>(40013, "Error", e.getMessage());
        } else if (e instanceof DuplicateKeyException) {
            //用户名重复
            return new CommonResult<>(40014, "ERROR", e.getMessage());
        } else {
            return new CommonResult<>(50000, "Error", "你触发了一个未知错误!");
        }
    }
}

从代码可以看到我们利用了@RestControllerAdvice注解注册了一个全局异常类,使用@ExceptionHandler注解捕获一个特定种类的错误,方便起见这里直接捕获的是Exception.class,在你的项目中你可以个性化的捕获不同的异常执行不同的操作。该类的内容比较简单易懂,不去啰嗦。那么项目的基本框架我们已经搭建完成了,在下一篇博客我们将会进入到model的编写和利用jwt进行权限的验证。

随着国内IT事业的兴起,越来越多的小伙伴也投身到了开发这个相对高薪的行业来。很多同学进入的方式都是零基础通过培训或者看视频自学,在工作一两年后,发现由于自己的基础太薄弱,想进一步提高自己的能力变得非常 困难。 现在市面上的视频教程,主要有一下两类:第一类是纯理论的,比如框架、算法、虚拟机等;另一类是Demo级别的项目,如各大培训机构的项目课程。从业这么多年,学习了大量的视频教程,也跟很多毕业三年左右的程序员做过交流,但一直没发现一套特别好的教程,能让小伙伴们从零基础一直到高级进阶,持续得到学习。在工作中,他们也反馈,视频教程各种高大上的技术堆砌,而在实际开发中呢,大部分技术都没有用到,就算是用,也完全不是像教程中那么用的。在面试中,你跟夸夸其谈十分钟,面试官一句,请问你在项目中是怎么用这个技术的,在使用的时候有什么问题?遇到这样的问题,大部分同学们都直接熄火,完全不知所措,为啥呢,因为他在项目中根本没有用过这个技术,只是看了文档、视频,只是跟着教程做了Demo。而技术跟业务如何结合,这应该是大部分同学在工作中最薄弱的环节。甚至,有些同学会唯技术论,面对公司的业务,会去抱怨公司用的技术不新,认为业务不重要。但我要纠正的是,技术的出现本来就是为业务服务的,离开业务谈技术那就是耍流氓。 早在两年前,我就萌生了这样的想法,既然国内的环境造成了面试修地球,上班拧螺丝的情况,那么我能不能结合我自己做的真实项目,脱敏后给大家分享出来,让各位同学能有一个真实的项目环境去边学边提高,所以,也就有了《从0开始用Java做"智慧农业物联网"》课程的诞生。 学习本课程的基本要求:有Java基础,学习过Spring,SpringMVC,Mybatis框架,做过简单项目以上的同学均可学习。但并不代表,本课程就是个入门教程,对于有开发经验的同学们,物联网这个行业是个朝阳产业,也可以说是未来十年发展的蓝海。那我相信,有实体经济支撑的行业绝不会像互联网行业有那样大的泡沫,也绝不会让你工作的没有安全感。对于有志于从事物联网相关工作的同学,对于想从各方面提升自己的各位同学们来说,本课程也非常的适合你们去学习。 我从12年就开始接触物联网项目,做过智慧猪场、智慧农场、猪联网、云医疗等相关项目,也做过互联网行业,兜兜转转一圈下来,自认为还是积累了很多的经验和教训,那我都会在我课程中对这样的知识有所分享。 同时,在这个课程中,我既是产品,又是设计,还是开发,还是运维,也是客户,我会从一个项目的全生命周期给大家进行介绍,并且都有相关的落地方案。这样,同学们的眼光就会有所延展,不会仅仅局限在开发这一亩三分地上。 本课程的亮点:我只能说,亮点很多,很多。。。 核心如下:产品经理眼中的产品、数据库设计、如何把一个需求变成代码、如何跟物联网设备交互、如何上线一个项目、在需求变更后如何做到不跟产品撕逼。。。 看到了吧,我不会只让你知道那些高大上的技术点,我向你们学会的是如何做一个完美的产品! 在这个课程中,你会看到太多太多跟其他教程不同的地方,你看到的不是Demo级别的案例,你看到的绝对是一个工业级别的实现方案。我也希望通过这个课程,同学们能进一步升华自己的视界,你所站的高度,你看问题的不同角度,将决定未来你成长的上限。 对于本课程的成长忠告:本课程的录制会持续很长时间,是的,你没看错,是很长时间,目前我的预期,起码是在年底之前不会结束,为什么要这样安排,因为我想要分享的内容实在太多,我也不想对课程进行拆分,也不想草草结束,所以,你所能得到的收获一定会足够大,他没有终点。。。 最终达到的效果:在业务中学技术点,通过技术点让业务变得更优美!
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页