最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用IDEA創(chuàng)建SpringBoot項(xiàng)目

 更新時(shí)間:2024年12月04日 09:33:53   作者:是坤坤嗎  
本文詳細(xì)介紹了使用SpringBoot創(chuàng)建項(xiàng)目,包含配置、啟動(dòng)、開發(fā)環(huán)境配置等,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1、使用SpringBoot腳手架創(chuàng)建

我們使用SpringBoot的腳手架Spring Initializr創(chuàng)建,如圖所示:

在這里插入圖片描述

2、選擇SpringBoot版本

最開始做項(xiàng)目時(shí)候,組長說創(chuàng)建一個(gè) springboot 2.5.4 的項(xiàng)目,mysql使用 5.6.X ,maven使用是3.6.X。其實(shí)最開始我也沒有多想,直接照做了,但是后面回想自己平時(shí)看到的SpringBoot開源代碼,有的是使用的是2.5.X,有的是使用2.6.X,還有的是使用2.7.X版本的,除了3以上版本在實(shí)際開發(fā)中沒有見過,目前2版本的見到的太多版本號(hào)不一樣的了。難道只要是2版本,都可以隨意使用?當(dāng)然我們知道不同的版本肯定是有差異的,每個(gè)版本都存在一些bug,后面的版本會(huì)對(duì)前一個(gè)版本進(jìn)行修護(hù)和升級(jí),也有一些方法,規(guī)則的調(diào)整。

所以說,如果要是一個(gè)人開發(fā),只要你不用到每個(gè)框架版本的新特性,使用一些常規(guī)的操作,其實(shí)也不用太關(guān)注版本,但是實(shí)際情況是,往往后端不是你一個(gè)人在開發(fā),要是每個(gè)人版本都不一樣,萬一出現(xiàn)了什么bug,排查起來也會(huì)比統(tǒng)一版本的情況下排查減少很多不必要的麻煩。所以開發(fā)中項(xiàng)目指定版本這里存在兩個(gè)目的,一個(gè)是:統(tǒng)一版本,方便管理(跟每家公司有自己的代碼規(guī)約一樣,遵守就行了),第二個(gè)目的,降低風(fēng)險(xiǎn),不使用版本太高的框架,且往往使用常用的框架版本進(jìn)行開發(fā),開發(fā)環(huán)境也比較熟悉。當(dāng)然最后還有一個(gè),多看看官網(wǎng),多了解一些框架的不同版本特性,也有助于自己開發(fā)。

2.1 推薦選擇2.7.x版本開發(fā)

spring2.X版本在2023年11月24日停止維護(hù)了,因此創(chuàng)建spring項(xiàng)目時(shí)不再有2.X版本的選項(xiàng),只能從3.1.X版本開始選擇而Spring3.X版本不支持JDK8,JDK11,最低支持JDK17,因此JDK8也無法選擇了,如圖所示:

在這里插入圖片描述

當(dāng)然,停止維護(hù)只代表我們無法用idea主動(dòng)創(chuàng)建spring2.X版本的項(xiàng)目了,不代表我們無法使用。目前阿里云還是支持創(chuàng)建Spring2.X版本的項(xiàng)目的,修改Server URL為https://start.aliyun.com,如圖所示:

在這里插入圖片描述

現(xiàn)在可以創(chuàng)建項(xiàng)目了,如圖所示:

在這里插入圖片描述

點(diǎn)擊Next,建議選擇2.7.x版本,并且根據(jù)項(xiàng)目需求添加依賴如圖所示:

在這里插入圖片描述

常用的依賴說明一下:

  • Lombok : 需要我們先安裝Lombok插件,可以簡化實(shí)體類書寫;
  • String Web:添加項(xiàng)目的web支持,比如內(nèi)置的Tomcat等;
  • MySQL Driver:我們用到MySQL數(shù)據(jù)庫,所以添加MySQL相關(guān)驅(qū)動(dòng)
  • MyBatis Framework:我們用到MyBatis這一ORM框架操作數(shù)據(jù)庫;
  • JDBC API:Spring對(duì)JDBC的封裝,如JdbcTemplate。

至此,簡單的SpringBoot項(xiàng)目算創(chuàng)建完成了。

3、配置項(xiàng)目并啟動(dòng)項(xiàng)目

3.1 創(chuàng)建項(xiàng)目結(jié)構(gòu)

1、創(chuàng)建配置文件

項(xiàng)目剛創(chuàng)建完成時(shí),默認(rèn)的配置文件是application.properties文件,當(dāng)然我們也可以創(chuàng)建application.yml文件。如果在yml文件中沒有輸入提示,需要到設(shè)置File Types中檢查是否設(shè)置了ymal文件,如圖所示:

在這里插入圖片描述

2、創(chuàng)建項(xiàng)目結(jié)構(gòu)

在這里插入圖片描述

3、配置maven
在這里配置本地Maven本地路徑、Maven倉庫。在本地Maven的settings.xml中會(huì)配置maven的鏡像資源等信息。

在這里插入圖片描述

4、檢查pom.xml文件
特別強(qiáng)調(diào),檢查一下pom.xml的<build>中的<skip>是否為true,有些情況會(huì)默認(rèn)為true。我們需要將其設(shè)置為<skip>false</skip>,或者去掉該標(biāo)簽,否則在打包的時(shí)候會(huì)沒有程序的入口類mainClass,然后導(dǎo)致無法啟動(dòng)程序:

在這里插入圖片描述

4、 下載相關(guān)依賴
在這里我們下載之前配置好的依賴,一般項(xiàng)目創(chuàng)建后會(huì)默認(rèn)下載

在這里插入圖片描述

5、 配置基礎(chǔ)內(nèi)容
在配置文件中配置一些基本的內(nèi)容:

server:
  port: 8080  # 端口號(hào)
  servlet:
    context-path: /myspringboot001   #項(xiàng)目根路徑(前面必須加/)


spring:
    # 項(xiàng)目名稱
    application:
      name: my-spring-boot001
    # Mysql配置
    datasource:
        driver-class-name:  com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3307/my-springboot-001?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
        username: root
        password: root1998

# Mybatis配置
mybatis:
  mapper-locations: classpath:mappers/*.xml #指定Mybatis的Mapper文件
  type-aliases-package: com.example.myspringboot001.*.entity  #指定Mybatis的實(shí)體目錄

6、 配置Mybatis包掃描路徑
我們?cè)趩?dòng)類上配置Mybatis的包掃描路徑,用注解@MapperScan

@SpringBootApplication
@MapperScan(value = {"com.example.myspringboot001.**.mapper"})
public class MySpringboot001Application {

    public static void main(String[] args) {
        SpringApplication.run(MySpringboot001Application.class, args);
    }

}

以上配置好之后,我們就可以啟動(dòng)springboot項(xiàng)目。瀏覽器輸入:http://localhost:8080/myspringboot001/ 后出現(xiàn)如下內(nèi)容,說明項(xiàng)目啟動(dòng)成功,如圖所示:

在這里插入圖片描述

4、配置多環(huán)境

在實(shí)際開發(fā)中,我們一般都會(huì)有好幾套運(yùn)行環(huán)境。比如開發(fā)環(huán)境、測(cè)試環(huán)境、生產(chǎn)環(huán)境等等
我們不可能每次都去修改一個(gè)配置文件,這就顯得很麻煩。下面我們主要說一說怎么配置多環(huán)境。

1、 修改application.yml配置文件

spring:
    # 項(xiàng)目名稱
    application:
      name: my-spring-boot001
    # 當(dāng)前配置文件
    profiles:
      active: dev

2、創(chuàng)建多環(huán)境配置文件

在這里插入圖片描述

上面的配置,項(xiàng)目在啟動(dòng)的時(shí)候就會(huì)加載application.yml(主)和application-dev.yml(副)配置文件。

注意:如果主配置文件和副配置文件的配置項(xiàng)沖突的時(shí)候,會(huì)優(yōu)先使用副配置文件的配置項(xiàng)。

5、連接數(shù)據(jù)庫查詢數(shù)據(jù)

5.1 新建數(shù)據(jù)庫my-springboot-001并且創(chuàng)建sys_user表

DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用戶名',
  `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶昵稱',
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶密碼',
  `sex` enum('1','2') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶性別',
  `birthday` date NULL DEFAULT NULL COMMENT '用戶生日',
  `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶郵箱',
  `phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶電話',
  `addr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶地址',
  `stop_flag` enum('1','0') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶啟用標(biāo)志',
  `create_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '用戶創(chuàng)建時(shí)間',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '用戶更新時(shí)間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `sys_user` VALUES (1, 'xiezhr', '程序員小凡', '12345678', '1', '1999-09-19', 'xiezhr@qq.com', '13288888888', '云南省昆明市', '0', '2023-09-04 21:08:32', NULL);
INSERT INTO `sys_user` VALUES (2, 'xiaoqi', '程序員曉柒', '123456', '1', '2020-10-04', 'xiaoqi@163.com', '13288888888', '云南文山', '0', '2023-09-04 21:09:42', NULL);
INSERT INTO `sys_user` VALUES (3, 'xiaodeng', '財(cái)務(wù)小鄧', '123456', '2', '2019-09-04', 'xiaodeng@qq.com', '13588888888', '云南文山', '0', '2023-09-04 21:10:43', NULL);

執(zhí)行結(jié)果如圖所示:

在這里插入圖片描述

5.2 創(chuàng)建實(shí)體類

@Data
public class SysUser implements Serializable {
    private static final long serialVersionUID = 123456789L;
    /**
     * 主鍵id
     */
    private Integer id;
    /**
     * 用戶名
     */
    private String username;
    /**
     * 用戶昵稱
     */
    private String nickname;
    /**
     * 用戶密碼
     */
    private String password;
    /**
     * 用戶性別
     */
    private String sex;
    /**
     * 用戶生日
     */
    private Date birthday;
    /**
     * 用戶郵箱
     */
    private String email;
    /**
     * 用戶電話
     */
    private String phone;
    /**
     * 用戶地址
     */
    private String addr;
    /**
     * 用戶啟用標(biāo)志
     */
    private String stopFlag;
    /**
     * 用戶創(chuàng)建時(shí)間
     */
    private Date createTime;
    /**
     * 用戶更新時(shí)間
     */
    private Date updateTime;

}

5.3 創(chuàng)建Mapper接口

數(shù)據(jù)訪問對(duì)象,是MVC架構(gòu)中負(fù)責(zé)與數(shù)據(jù)庫進(jìn)行交互的組件。它封裝了數(shù)據(jù)庫的訪問操作,提供給Service層調(diào)用。Dao層通常包含一系列方法,用于對(duì)數(shù)據(jù)庫進(jìn)行增刪改查操作,以及與數(shù)據(jù)庫的連接、事務(wù)管理等。@Mapper表示這個(gè)接口是一個(gè)MyBatis的Mapper接口,用于定義數(shù)據(jù)庫操作的方法。

@Mapper
public interface SysUserMapper {

    /**
     * 查詢所有用戶信息
     * @return  所有用戶信息
     */
    List<SysUser> querySysUserList();
}

5.4 創(chuàng)建Mybatis的xml文件

MyBatis的映射文件(mapper),用于操作數(shù)據(jù)庫中的sys_user表。其中定義了一個(gè)resultMap用于映射查詢結(jié)果到SysUser對(duì)象,還定義了一個(gè)select語句用于查詢sys_user表中的所有用戶信息。 id=“querySyserList” 必須與mapper接口中方法名一致。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.myspringboot001.system.mapper.SysUserMapper">
    <resultMap type="com.example.myspringboot001.system.entity.SysUser" id="SysUserMap">
        <result property="id" column="id" jdbcType="INTEGER"/>
        <result property="username" column="username" jdbcType="VARCHAR"/>
        <result property="nickname" column="nickname" jdbcType="VARCHAR"/>
        <result property="password" column="password" jdbcType="VARCHAR"/>
        <result property="sex" column="sex" jdbcType="VARCHAR"/>
        <result property="birthday" column="birthday" jdbcType="TIMESTAMP"/>
        <result property="email" column="email" jdbcType="VARCHAR"/>
        <result property="phone" column="phone" jdbcType="VARCHAR"/>
        <result property="addr" column="addr" jdbcType="VARCHAR"/>
        <result property="stopFlag" column="stop_flag" jdbcType="VARCHAR"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <!--查詢所有用戶信息-->
    <select id="querySysUserList" resultMap="SysUserMap">
        select * from sys_user
    </select>
</mapper>

這里需要注意的是,IDEA在創(chuàng)建Mybatis的Mapper XML文件時(shí),是沒有頭部信息,往往我們需要去復(fù)制過來,這就會(huì)很麻煩,我們可以自定義Mybatis Mapper XML文件模板,這樣我們創(chuàng)建Mapper XML時(shí)就會(huì)有頭部信息了如圖所示:

在這里插入圖片描述

然后我們?cè)谛陆ㄎ募r(shí)選擇Mybatis Mapper XML就可以了,如圖:

在這里插入圖片描述

5.5 創(chuàng)建Service接口及實(shí)現(xiàn)類

Service是MVC架構(gòu)中負(fù)責(zé)處理業(yè)務(wù)邏輯的組件。它封裝了業(yè)務(wù)邏輯的實(shí)現(xiàn)細(xì)節(jié),提供給Controller調(diào)用。Service層通常包含一系列方法,用于處理各種業(yè)務(wù)需求,如數(shù)據(jù)處理、事務(wù)管理、業(yè)務(wù)規(guī)則校驗(yàn)等。

1、創(chuàng)建SysUserService接口

public interface SysUserService {

    /**
     * 查詢所有用戶信息
     * @return  所有用戶信息
     */
    List<SysUser> querySysUserList();
}

2、創(chuàng)建SysUserServiceImpl實(shí)現(xiàn)類

@Service
public class SysUserServiceImpl implements SysUserService {

    @Resource
    private SysUserMapper userMapper;
    
    @Override
    public List<SysUser> querySysUserList() {
        return userMapper.querySysUserList();
    }
}

5.6 創(chuàng)建Controller

Controller是MVC架構(gòu)中負(fù)責(zé)接收用戶請(qǐng)求并處理的組件。它接收來自用戶的請(qǐng)求,并根據(jù)請(qǐng)求的內(nèi)容調(diào)用相應(yīng)的Service方法進(jìn)行業(yè)務(wù)處理,然后返回結(jié)果給用戶。Controller通常負(fù)責(zé)路由請(qǐng)求、參數(shù)驗(yàn)證、調(diào)用Service等操作。

1、創(chuàng)建SysUserController

@RestController
@RequestMapping("/sysUser")
public class SysUserController {

    @Autowired
    private SysUserService sysUserService;

    /**
     * 查詢所有用戶信息
     * @return
     */
    @RequestMapping(value = "/querySysUser",method = RequestMethod.GET)
    public List<SysUser> querySysUser(){
        return sysUserService.querySysUserList();
    }
}

到此我們?nèi)蠼M件的代碼都寫完了,接下來我們來看看我們寫好的接口,PostMan地址欄輸入:http://localhost:8080/myspringboot001/sysUser/querySysUser,如圖所示:

在這里插入圖片描述

我們可以看到返回的時(shí)間格式是"2020-10-03T16:00:00.000+00:00"這樣的,可讀性很差。其實(shí)呢,日期格式化非常簡單,我們只需要在之前定義好的實(shí)體類SysUser的日期屬性上加上一個(gè)注解**@JsonFormat**即可:

import com.fasterxml.jackson.annotation.JsonFormat;

@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;

我們來測(cè)試一下,通過格式化的日期就是我們習(xí)慣的日期格式了,如圖所示:

在這里插入圖片描述

6、封裝統(tǒng)一結(jié)果返回

為了保證所有接口返回的數(shù)據(jù)格式一致,減少重復(fù)代碼編寫。我們將對(duì)返回結(jié)果進(jìn)行統(tǒng)一處理。
具體返回結(jié)果格式如下:

{
  "code": 200, // 狀態(tài)碼,表示請(qǐng)求的處理結(jié)果
  "message": "請(qǐng)求成功", // 狀態(tài)消息,對(duì)請(qǐng)求結(jié)果的簡要描述
  "data": { // 數(shù)據(jù)對(duì)象,用于存儲(chǔ)具體的返回?cái)?shù)據(jù)
    "key1": "value1",
    "key2": "value2"
  }
}
  • code :表示請(qǐng)求的處理結(jié)果,一般采用HTTP狀態(tài)碼或自定義的業(yè)務(wù)狀態(tài)碼
  • message :對(duì)請(qǐng)求結(jié)果的簡要描述,通常是一個(gè)字符串
  • data :用于存儲(chǔ)具體的返回?cái)?shù)據(jù),可以是一個(gè)對(duì)象、數(shù)組或其他類型的數(shù)據(jù)

6.1 定義 IResultCode 的接口

它位于com.example.myspringboot001.common包中,可以由不同的類來實(shí)現(xiàn),實(shí)現(xiàn)一致且統(tǒng)一的結(jié)果碼和消息的處理和返回:

public interface IResultCode {
    /**
     * 獲取狀態(tài)碼
     * @return  狀態(tài)碼
     */
    String getCode();

    /**
     * 獲取狀態(tài)信息
     * @return  狀態(tài)信息
     */
    String getMsg();
}

6.2 定義了一個(gè)枚舉類 ResultCode

定義了一個(gè)枚舉類 ResultCode ,它實(shí)現(xiàn)了 IResultCode 接口,并包含了一些常見的響應(yīng)碼和對(duì)應(yīng)的消息:

public enum ResultCode implements IResultCode, Serializable {
    SUCCESS("200","成功"),
    NOT_FOUND("404","未找到"),
    INTERNAL_SERVER_ERROR("500","服務(wù)器內(nèi)部錯(cuò)誤");
    
    private String code;
    private String msg;
    
    ResultCode(String code, String msg){
        this.code = code;
        this.msg = msg;
    }
    
    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getMsg() {
        return msg;
    }
}

定義系統(tǒng)中常見的響應(yīng)碼和對(duì)應(yīng)的消息,用于表示不同的業(yè)務(wù)場(chǎng)景或操作的執(zhí)行結(jié)果每個(gè)枚舉常量都包含一個(gè) code 和一個(gè) msg ,分別表示響應(yīng)碼和消息內(nèi)容枚舉常量包括了一些常見的響應(yīng)碼,如 SUCCESS 表示成功, INTERNAL_SERVER_ERROR 服務(wù)器內(nèi)部錯(cuò)誤, NOT_FOUND 表示未找到。

6.3 定義統(tǒng)一響應(yīng)結(jié)構(gòu)體

定義了一個(gè)名為 Result 的類,用于表示統(tǒng)一的響應(yīng)結(jié)構(gòu)體:

@Data
public class Result<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    private String code;
    private String msg;
    private T data;

    public static<T>  Result<T> success() {
        return success(null);
    }

    public static<T>  Result<T> success(T data) {
        Result result = new Result<>();
        result.setCode(ResultCode.SUCCESS.getCode());
        result.setMsg(ResultCode.SUCCESS.getMsg());
        result.setData(data);
        return result;
    }

    public static <T> Result<T> error(String msg) {
        Result<T> result = new Result<>();
        result.setCode(ResultCode.ERROR.getCode());
        result.setMsg(ResultCode.ERROR.getMsg());
        return result;
    }
}

到此,統(tǒng)一響應(yīng)返回我們已經(jīng)封裝好了,我們來改造一下Controller中的代碼看看效果。

1、SysUserController未改之前:

@RequestMapping(value = "/querySysUser",method = RequestMethod.GET)
public List<SysUser> querySysUser(){
    return sysUserService.querySysUserList();
}

2、SysUserController未改之后:

@RequestMapping(value = "/querySysUser",method = RequestMethod.GET)
public Result querySysUser(){
    return Result.success(sysUserService.querySysUserList());
}

再次測(cè)試返回的數(shù)據(jù):

在這里插入圖片描述

7、定義視圖對(duì)象VO

從上面的返回結(jié)果,我們會(huì)發(fā)現(xiàn)將密碼等敏感信息返回到了前端,這是非常不可取的這時(shí),我們就需要根據(jù)前端的需求,靈活地選擇需要展示的數(shù)據(jù)字段。

7.1 定義VO

定義一個(gè)需要返回前端的VO

@Data
public class SysUserVo {

    /**
     * 用戶名
     */
    private String username;
    /**
     * 用戶昵稱
     */
    private String nickname;

    /**
     * 用戶性別
     */
    private String sex;
    /**
     * 用戶生日
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    /**
     * 用戶郵箱
     */
    private String email;
    /**
     * 用戶電話
     */
    private String phone;
    /**
     * 用戶地址
     */
    private String addr;
}

7.2 service改造

SysUserService改造前

/**
     * 查詢所有用戶信息
     * @return  所有用戶信息
     */
    List<SysUser> querySysUserList();

SysUserServiceImpl改造前

@Override
    public List<SysUser> querySysUserList() {
        System.out.println(sysUserMapper);
        return sysUserMapper.querySysUserList();
    }

SysUserService改造后

/**
     * 查詢所有用戶信息
     * @return  所有用戶信息
     */
    List<SysUserVo> querySysUserList();

SysUserServiceImpl改造后

    @Override
    public List<SysUserVo> querySysUserList() {
        List<SysUserVo> sysUserVos = new ArrayList<>();
        List<SysUser> sysUsers = sysUserMapper.querySysUserList();
        // 將po的值復(fù)制到vo中
        sysUsers.forEach(sysUser -> {
            SysUserVo vo = new SysUserVo();
            BeanUtils.copyProperties(sysUser, vo);
            sysUserVos.add(vo);
        });
        return sysUserVos;
    }

我們?cè)俅斡胮ostman測(cè)試,輸入http://localhost:8080/myspringboot001/sysUser/querySysUser,結(jié)果如圖所示:

在這里插入圖片描述

8、統(tǒng)一異常處理

日常開發(fā)中,我們處理異常一般都會(huì)用到try-catch 、throw和throws 的方式拋出異常。這種方式不僅僅程序員處理麻煩,對(duì)用戶來說也不太友好我們都希望不用寫過多的重復(fù)代碼處理異常,又能提升用戶體驗(yàn)。這時(shí)候全局異常處理就顯得很便捷很重要了。
Springboot對(duì)于異常的處理也做了不錯(cuò)的支持,它提供兩個(gè)注解供我們使用。

  • @ControllerAdvice注解 :用來開啟全局的異常捕獲,
  • @ExceptionHandler注解:說明捕獲哪些異常,對(duì)那些異常進(jìn)行處理

8.1 添加自定義異常與其他異常返回結(jié)果

我們?cè)赗esult 類中添加如下兩個(gè)方法來處理自定義異常和其他異常返回結(jié)果:

//自定義異常返回的結(jié)果
public static <T> Result<T> bussinessErr(BusinessException e) {
    Result<T> result = new Result<>();
    result.setCode(e.getErrorCode());
    result.setMsg(e.getErrorMsg());
    result.setData(null);
    return result;
}
//其他異常處理方法返回的結(jié)果
public static <T> Result<T> otherErr(ResultCode resultCode) {
    Result<T> result = new Result<>();
    result.setCode(resultCode.getCode());
    result.setMsg(resultCode.getMsg());
    result.setData(null);
    return result;
}

8.2 自定義異常類

在com.example.myspringboot001.common.exception包中新建BusinessException異常類:

public class BusinessException  extends RuntimeException{
    private String errorCode;
    private String errorMsg;

    public BusinessException() { }

    public BusinessException(String errorCode, String errorMsg) {
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

}

8.3 全局異常處理

我們自定義一個(gè)全局異常處理類,來處理各種異常,包括自己定義的異常和內(nèi)部異常 。這樣可以簡化不少代碼,不用自己對(duì)每個(gè)異常都使用try,catch的方式來實(shí)現(xiàn)。
在com.example.myspringboot001.common.handler包中新建GlobalExceptionHandler全局異常處理類:

@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 處理自定義異常
     *
     */
    @ExceptionHandler(value = BusinessException.class)
    @ResponseBody
    public<T> Result<T> bizExceptionHandler(BusinessException e) {
        return Result.bussinessErr(e);
    }

    /**
     * 處理其他異常
     *
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result exceptionHandler(Exception e) {
        return Result.otherErr(ResultCode.ERROR);
    }

}

8.4 測(cè)試異常處理

我們?cè)赟ysUserController 中添加如下代碼來測(cè)試下異常,看看能不能捕獲到:

	@RequestMapping("/getBusinessException")
    public Result DeException(){
        throw new BusinessException("400","我出錯(cuò)了");
    }
    
    @RequestMapping("/getException")
    public Result Exception(){
        Result result = new Result();
        int a = 1 / 0;
        return result;
    }

在這里插入圖片描述

在這里插入圖片描述

9、 添加系統(tǒng)日志

日志記錄應(yīng)用程序的運(yùn)行狀態(tài),通過日志開發(fā)者可以更好的了解應(yīng)用程序的運(yùn)行情況當(dāng)系統(tǒng)出現(xiàn)bug時(shí),也能通過日志快速定位問題和解決問題。

9.1 常用日志框架

在這里插入圖片描述

我們需要需要選擇一個(gè)日志門面 和日志實(shí)現(xiàn),Spring Boot默認(rèn)集成了SLF4j 和Logback作為日志實(shí)現(xiàn)框架。如果您使用Maven構(gòu)建項(xiàng)目,通常無需手動(dòng)添加Logback依賴,因?yàn)镾pring Boot的起步依賴(starter dependencies)中已經(jīng)包含了它。

9.2 日志常用配置

1、日志輸出分析,如圖所示:

在這里插入圖片描述

  • 日期時(shí)間:精確到毫秒
  • 日志級(jí)別:TRACE | DEBUG | INFO | WARN | ERR
  • 進(jìn)程ID:60236
  • 分隔符:默認(rèn)以—進(jìn)行分割
  • 線程名:由中括號(hào)括起來,如[ main]
  • Logger名: 一般使用類全限定名
  • 日志內(nèi)容

2、日志級(jí)別
日志級(jí)別由低到高如下

TRACE < DEBUG< INFO< WARN < ERROR

如果設(shè)置為 WARN ,則低于 WARN 的信息都不會(huì)輸出 Spring Boot中默認(rèn)配置是INFO級(jí)別。

3、調(diào)整日志級(jí)別
可以在配置文件application.yml中設(shè)置:

logging.level.root=DEBUG

或者在運(yùn)行Spring Boot應(yīng)用程序時(shí),通過命令行參數(shù)來設(shè)置日志級(jí)別

java -jar your-application.jar --logging.level.root=DEBUG

4、日志寫到文件中
需在application.properties或application.yml配置文件中設(shè)置logging.file.pathlogging.file.name屬性。

logging:
  file:
    path: /myspringboot/log   # 只能指定路徑,文件名默認(rèn)為 spring.log,這里相當(dāng)于window的 E:\myspringboot\log\spring.log
    #name: /myspringboot/log/my.log # 可以指定文件路徑和文件名,這里相當(dāng)于window的 E:\myspringboot\log\my.log
    #name: my.log  使用相對(duì)路徑,這里相當(dāng)于window的 E:\WorkPlace\IDEA\my-springboot-001\my.log

注意:logging.file.path和logging.file.name只能生效一個(gè),在配置了兩者的情況下,以logging.file.name的配置為準(zhǔn)。

9.3 日志的基本使用

1、使用官方例子

 Logger logger = LoggerFactory.getLogger(SysUserController.class);
    
    @Autowired
    private SysUserService sysUserService;

    /**
     * 查詢所有用戶信息
     * @return
     */
    @RequestMapping(value = "/querySysUser",method = RequestMethod.GET)
    public Result querySysUser(){
        String name = "tanya";
        logger.info("this name is {}", name);
        return Result.success(sysUserService.querySysUserList());
    }

2、使用lombok插件
第一種方法中,每次使用都要?jiǎng)?chuàng)建了一個(gè)名為 logger 的Logger對(duì)象,使用起來有點(diǎn)繁瑣。這里我們引入注解方式實(shí)現(xiàn)。使用注解**@Slf4j** 需要安裝lombok插件。

@Slf4j
public class SysUserController {

    @Autowired
    private SysUserService sysUserService;

    /**
     * 查詢所有用戶信息
     * @return
     */
    @RequestMapping(value = "/querySysUser",method = RequestMethod.GET)
    public Result querySysUser(){
        log.info("this name is {}", name);
        return Result.success(sysUserService.querySysUserList());
    }
}

可以用{} 占位符來拼接字符串,而不需要使用+來連接字符串。

9.4 日志高級(jí)配置

前面幾節(jié)說的都是springboot基本日志配置,如果這些都不能滿足我們的需求,我們就需要添加logback-spring.xml 官方推薦的配置文件進(jìn)行配置。

注意:如果同時(shí)存在logback.xmllogback-spring.xml,Spring Boot 將會(huì)優(yōu)先選擇 logback-spring.xml 作為日志配置。logback.xml多用于非springboot項(xiàng)目;logback-spring.xml只能用于springboot項(xiàng)目,即帶有@SpringBootApplication啟動(dòng)程序中才生效,在main或者Junit中依然不生效。并且這兩個(gè)文件的配置項(xiàng)優(yōu)先于application.yml的日志配置。

logback-spring.xml 中 配置了兩個(gè) 分別是

  • 輸出到控制臺(tái)
  • 將日志寫到文件中
  • 使用 指定開發(fā)/生產(chǎn)環(huán)境配置
    參考如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志級(jí)別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設(shè)置為WARN,則低于WARN的信息都不會(huì)輸出 -->
<configuration>

    <!-- SpringBoot默認(rèn)logback的配置 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
    <property name="LOG_HOME" value="/logs/${APP_NAME}"/>

    <!--1. 輸出到控制臺(tái)-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!-- <withJansi>true</withJansi>-->
        <!--此日志appender是為開發(fā)使用,只配置最低級(jí)別,控制臺(tái)輸出的日志級(jí)別是大于或等于此級(jí)別的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 2. 輸出到文件  -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 當(dāng)前記錄的日志文檔完整路徑 -->
        <file>${LOG_HOME}/log.log</file>
        <!--日志文檔輸出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} -%5level ---[%15.15thread] %-40.40logger{39} : %msg%n%n</pattern>
            <charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
        </encoder>
        <!-- 日志記錄器的滾動(dòng)策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>   <!--這里是超出大小后新建的文件名,并且保存的是分割前面的舊日志,新日志還是在log.log中-->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>5KB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文檔保留天數(shù)-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 臨界值過濾器,輸出大于INFO級(jí)別日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <!-- 開發(fā)環(huán)境輸出至控制臺(tái)和文件 -->
    <springProfile name="dev">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        </root>
    </springProfile>

    <!-- 生產(chǎn)環(huán)境輸出至控制臺(tái)和文件 -->
    <springProfile name="prod">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        </root>
    </springProfile>
</configuration>

最終完整的項(xiàng)目結(jié)構(gòu)如下:

在這里插入圖片描述

到此這篇關(guān)于使用IDEA創(chuàng)建SpringBoot項(xiàng)目的文章就介紹到這了,更多相關(guān)IDEA創(chuàng)建SpringBoot項(xiàng)目內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • java實(shí)現(xiàn)文件保存到本地的方法

    java實(shí)現(xiàn)文件保存到本地的方法

    本篇文章主要介紹了java實(shí)現(xiàn)文件保存到本地的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Java設(shè)計(jì)模式之java觀察者模式詳解

    Java設(shè)計(jì)模式之java觀察者模式詳解

    這篇文章主要介紹了Java經(jīng)典設(shè)計(jì)模式之觀察者模式,簡單分析了觀察者模式的概念、原理并結(jié)合實(shí)例形式給出了java觀察者模式的具體用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2021-09-09
  • Java并發(fā)工具之Exchanger線程間交換數(shù)據(jù)詳解

    Java并發(fā)工具之Exchanger線程間交換數(shù)據(jù)詳解

    這篇文章主要介紹了Java并發(fā)工具之Exchanger線程間交換數(shù)據(jù)詳解,Exchanger是一個(gè)用于線程間協(xié)作的工具類,Exchanger用于進(jìn)行線程間的數(shù)據(jù)交 換,它提供一個(gè)同步點(diǎn),在這個(gè)同步點(diǎn),兩個(gè)線程可以交換彼此的數(shù)據(jù),需要的朋友可以參考下
    2023-12-12
  • Hibernate核心思想與接口簡介

    Hibernate核心思想與接口簡介

    這篇文章主要介紹了Hibernate核心思想與接口的相關(guān)內(nèi)容,需要的朋友可以參考下。
    2017-09-09
  • Elasticsearch倒排索引詳解及實(shí)際應(yīng)用中的優(yōu)化

    Elasticsearch倒排索引詳解及實(shí)際應(yīng)用中的優(yōu)化

    Elasticsearch(ES)使用倒排索引來加速文本的搜索速度,倒排索引之所以高效,主要是因?yàn)樗淖兞藬?shù)據(jù)的組織方式,使得查詢操作可以快速完成,這篇文章主要給大家介紹了關(guān)于Elasticsearch倒排索引詳解及實(shí)際應(yīng)用中優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • Java使用遞歸復(fù)制文件夾及文件夾

    Java使用遞歸復(fù)制文件夾及文件夾

    這篇文章主要介紹了Java使用遞歸復(fù)制文件夾及文件夾,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 掌握SpringMVC中@InitBinder的實(shí)際應(yīng)用

    掌握SpringMVC中@InitBinder的實(shí)際應(yīng)用

    這篇文章主要介紹了掌握SpringMVC中@InitBinder的實(shí)際應(yīng)用,@InitBinder是Spring MVC框架中的一個(gè)注解,用于自定義數(shù)據(jù)綁定的方法,通過在控制器中使用@InitBinder注解,可以將特定的數(shù)據(jù)綁定邏輯應(yīng)用于請(qǐng)求參數(shù)的處理過程中,需要的朋友可以參考下
    2023-10-10
  • 深入淺析Java中的final關(guān)鍵字

    深入淺析Java中的final關(guān)鍵字

    在Java中,final關(guān)鍵字可以用來修飾類、方法和變量(包括成員變量和局部變量),下面通過本篇文章給大家介紹java中的final關(guān)鍵字,對(duì)java fina關(guān)鍵字相關(guān)知識(shí)感興趣的朋友一起看看吧
    2015-12-12
  • SWT(JFace)小制作 BugTracker

    SWT(JFace)小制作 BugTracker

    SWT(JFace)小制作 BugTracker
    2009-06-06
  • JavaSE之File類用法(遞歸查找文件)

    JavaSE之File類用法(遞歸查找文件)

    這篇文章主要介紹了JavaSE之File類用法(遞歸查找文件),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2026-03-03

最新評(píng)論

马边| 平江县| 贡觉县| 英德市| 同德县| 伽师县| 静乐县| 清原| 柯坪县| 新乐市| 六枝特区| 广安市| 襄樊市| 海兴县| 大英县| 泰州市| 龙胜| 香港| 泾源县| 奎屯市| 申扎县| 西丰县| 封丘县| 华亭县| 秦皇岛市| 栾城县| 铜山县| 汉阴县| 南充市| 巴楚县| 阿拉善左旗| 洮南市| 诏安县| 泰安市| 乌海市| 建宁县| 祁连县| 乐陵市| 昂仁县| 绥化市| 安平县|