1. 程式人生 > >Java程式設計中Springboot的異常處理與自定義異常處理教程

Java程式設計中Springboot的異常處理與自定義異常處理教程

元旦很快就到來了,提前祝各位元旦快樂,今天給大家分享一個工作中必用一個知識點,就是在Java開發中使用列舉構建自定義異常並應用於springboot的異常處理器。
開始之前我先把這個案例的結構大致說明一下:
1、使用idea建立一個springboot的Gradle/Maven專案,引入web模組即可(由於案例的重點是異常處理,所以跳過其他操作)。
2、建立一個javabean,用來接收前臺的引數。
3、建立一個列舉、封裝異常的錯誤碼等資訊。
4、建立一個自定義異常類繼承RuntimeException。
5、建立一個controller,用來處理使用者請求。
6、建立一個springboot的異常處理類。
7、執行專案,測試。
OK、接下來就進入正題,先來第一步,建立專案(建立專案的過程就不需要一一演示了吧,_

),
下面是建立專案之後的Gradle專案中build.gradle中的依賴:
1 dependencies {
2 implementation(‘org.springframework.boot:spring-boot-starter-web’)
3 testImplementation(‘org.springframework.boot:spring-boot-starter-test’)
4 }如果各位讀者是maven專案的話,pom.xml檔案中的依賴應該長這樣子: 1
2
3 org.springframework.boot
4 spring-boot-starter-web
5
6
7
8 org.springframework.boot
9 spring-boot-starter-test
10 test
11
12
ok,下面開始第二步,建立一個javabean:package com.maolinjava.entity;

import java.io.Serializable;

/**

  • Created by tml on 2018/12/28.
    */
    public class User implements Serializable {

    private String username;

    private String password;

    public String getUsername() {
    return username;
    }

    public void setUsername(String username) {
    this.username = username;
    }

    public String getPassword() {
    return password;
    }

    public void setPassword(String password) {
    this.password = password;
    }
    }

ok,再來第三步,建立一個列舉、封裝異常的錯誤碼等資訊:package com.maolinjava.commons.constant;

/**

  • Created by tml on 2018/12/28.
    */
    public enum ServiceErrCode {

    REQ_PARAM_ERR(10001,“請求引數異常”),
    NOTFOUND_RESULT_ERR(10004,“未找到結果”);

    private int code;

    ServiceErrCode(int code,String msg){
    this.code = code;
    }

    public int getCode() {
    return code;
    }
    }

再來第四步、建立自定義異常類:package com.maolinjava.commons.exception;

import com.maolinjava.commons.constant.ServiceErrCode;

/**

  • Created by tml on 2018/12/28.
    */
    public class BaseServiceException extends RuntimeException {

    private int code;

    public BaseServiceException(String message, ServiceErrCode serviceErrCode) {
    //構造器的第二個引數是上面建立的那個列舉,之後把列舉裡面定義的code給了這個code
    super(message);
    this.code = serviceErrCode.getCode();
    }

    public int getCode() {
    return code;
    }

    @Override
    public String getMessage() {
    return super.getMessage();
    }
    }

第五步,建立一個controller:package com.maolinjava.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.maolinjava.commons.constant.ServiceErrCode;
import com.maolinjava.commons.exception.BaseServiceException;
import com.maolinjava.entity.User;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.Objects;

/**

  • Created by tml on 2018/12/28.
    */
    @RestController
    public class UserController {

    @Resource
    private ObjectMapper jsonMapper;

    @PostMapping("/login")
    public ObjectNode login(@RequestBody(required = false) User user){
    //如果使用者發起的請求引數中user為null的話,就會丟擲自定義的異常,之後會被全域性的異常處理器所攔截響應到前端
    if(Objects.isNull(user)){
    throw new BaseServiceException(“使用者為空,請填寫使用者名稱和密碼”, ServiceErrCode.REQ_PARAM_ERR);
    }
    //如果輸入了使用者名稱和密碼則正常把輸入的資訊響應回去
    System.out.println(user);
    return jsonMapper.createObjectNode().putPOJO(“data”,user);
    }

}
OK,再來第六步、建立一個springboot的異常處理類:package com.maolinjava.commons.exception.handler;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.maolinjava.commons.exception.BaseServiceException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.annotation.Resource;

/**

  • Created by tml on 2018/12/28.
    */
    @RestControllerAdvice
    public class GlobalExceptionHandler {

    @Resource
    private ObjectMapper jsonMapper;

    @ExceptionHandler(BaseServiceException.class)
    public ObjectNode baseServiceException(BaseServiceException e){
    int code = e.getCode();
    String msg = e.getMessage();
    return jsonMapper.createObjectNode().put(“code”,code).put(“msg”,msg);
    }

}
這個異常處理類主要用到的兩個註解是@RestControllerAdvice和@ExceptionHandler(xxx.class),說明一下:
@RestControllerAdvice註解表示全域性的異常通知,裡面的value屬性可以指定一個異常通知的包範圍,一般這個不用去指定,就讓他對全部的包進行掃描即可;
@ExceptionHandler(xxx.class)這個註解加在方法上,表示要攔截的某個異常並對該異常進行處理,裡面的引數是要攔截的異常的型別,我這裡攔截的是BaseServiceException這個異常,如果程式中有丟擲BaseServiceException的地方就會進入該方法進行處理。
程式碼已經全部OK,啟動專案,開啟postman訪問 localhost:8080/login,附一張postman的請求截圖:
在這裡插入圖片描述

很明顯,這個請求中是有傳遞使用者名稱和密碼的,所以程式正常執行,返回如下結果:
在這裡插入圖片描述
我們的重點是要測試異常,所以把請求引數都去掉,什麼都不傳,響應以下結果:
在這裡插入圖片描述

很明顯,code就是我們在列舉中定義的code,msg就是在丟擲異常的時候填寫的異常資訊,隨後這個異常完美的被帶有@RestControllerAdvice註解的GlobalExceptionHandler類的baseServiceException方法所攔截,成功響應上面的結果。
OK,這就是springboot的異常處理與自定義異常的使用案例,這些都是十分基礎的東西,後面我會給大家分享一些技術乾貨,請各位多多支援。

文章來自:https://www.itjmd.com/news/show-5310.html