Teknologian jakaminen

SpringBoot: SpringBoot yhtenäinen vastaus ja yhtenäinen poikkeuskäsittely

2024-07-06

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

I. Johdanto

Spring Boot -sovelluksia kehitettäessä tapa, jolla vastaustuloksia ja poikkeuksia käsitellään, vaikuttaa ratkaisevasti projektin ylläpidettävyyteen, skaalautumiseen ja tiimiyhteistyöhön. Hajautetut vastaustulokset ja poikkeusten käsittelylogiikka johtavat usein redundanttiseen koodiin, jota on vaikea ymmärtää ja ylläpitää. Siksi yhtenäinen tulosten palautus ja yhtenäinen poikkeusten käsittely ovat yksi tärkeimmistä strategioista projektin laadun parantamiseksi.

2. Yhtenäinen tulospalautus

Tulosten palautusten yhdistäminen tarkoittaa yleensä vakiovastausmuodon määrittämistä kaikille ohjainmenetelmille. Tämä voidaan saavuttaa luomalla yksi tai useampi vastausentiteettiluokka, joka sisältää yleisiä kenttiä, kuten tilakoodin, viestin ja datan. Kun ohjainmenetelmä on käsitellyt liiketoimintalogiikan, se täyttää nämä kentät ja palauttaa ne asiakkaalle.

Katsotaan seuraavaksi, kuinka saada yhtenäinen tulostuotto SpringBootissa.

1. Määritä yhteinen vastausobjekti

Luo yleinen vastausobjekti, määritä onnistumis- ja epäonnistumisskenaariot ja varmista, että yleistä paluuobjektia käytetään käyttöliittymässä.

public class ResponseResult {

    private int code;

    private String message;

    private Object data;

    public static ResponseResult success(Object data) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setData(data);
        responseResult.setCode(ResultEnum.SUCCESS.code);
        return responseResult;
    }

    public static ResponseResult error(ResultEnum resultEnum) {
        return error(resultEnum, resultEnum.message);
    }

    public static ResponseResult error(ResultEnum resultEnum, String message) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setCode(resultEnum.code);
        responseResult.setMessage(message);
        return responseResult;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

2. Määritä liitännän vastauksen tilakoodi

Yhteisen tilakoodijoukon määrittäminen on yksi yhtenäisen tulospalautuksen keskeisistä avaimista. Tämä lähestymistapa ei ainoastaan ​​paranna API:n käytettävyyttä ja ylläpidettävyyttä, vaan mahdollistaa myös vastaustietojen jäsentämisen ja käsittelyn tehokkaammin. Se tarjoaa myös API-kehittäjille selkeän ja johdonmukaisen standardin.

public enum ResultEnum {

    SUCCESS(200 ,"请求处理成功"),
    SERVICE_ERROR(500, "服务器异常,请稍后重试");

    public final Integer code;

    public final String message;

    ResultEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

3. Määrittele yhtenäiset onnistumisen ja epäonnistumisen käsittelymenetelmät

public class ResponseResult {

    private int code;

    private String message;

    private Object data;

    public static ResponseResult success(Object data) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setData(data);
        responseResult.setCode(ResultEnum.SUCCESS.code);
        return responseResult;
    }

    public static ResponseResult error(ResultEnum resultEnum) {
        return error(resultEnum, resultEnum.message);
    }

    public static ResponseResult error(ResultEnum resultEnum, String message) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setCode(resultEnum.code);
        responseResult.setMessage(message);
        return responseResult;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

4. Ohjain reagoi tasaisesti tuloksiin

@GetMapping("/testResult")
 public ResponseResult test() {
     // 模拟业务逻辑
     try {
         // 假设这里有一些业务逻辑
         return ResponseResult.success("success");
     } catch (Exception e) {
         // 捕获异常并返回错误信息
         return ResponseResult.error(ResultEnum.SERVICE_ERROR);
     }
 }

3. Yhtenäinen poikkeuskäsittely

Yhtenäinen poikkeuskäsittely käyttää globaalia poikkeuskäsittelijää ohjaimeen heitettyjen poikkeuksien kaappaamiseen ja käsittelemiseen. Tämä lähestymistapa välttää päällekkäisen poikkeuksenkäsittelykoodin kirjoittamisen jokaiseen ohjainmenetelmään ja tekee myös poikkeusten käsittelylogiikasta keskitetymmän ja helpommin hallittavan.

@RestControllerAdvice
@RestControllerAdvice on yhdistetty huomautus, joka on yhdistelmä @ControllerAdvicesta ja @ResponseBodysta. Sitä käytetään pääasiassa globaalien konfigurointien tarjoamiseen ohjainkerrokselle, kuten poikkeusten käsittelyyn, tietojen sitomiseen, tietojen esikäsittelyyn jne. Koska se sisältää @ResponseBody, kaikki @RestControllerAdvicen kautta käsitellyt menetelmät kirjoittavat palautusarvon HTTP-vastauksen runkoon oletuksena ja asettavat sopivan sisältötyypin.

@ExceptionHandler
@ExceptionHandler-merkintää käytetään merkitsemään menetelmä, joka käsittelee ohjaimeen heitettäviä poikkeuksia. Kun ohjaimen menetelmä heittää poikkeuksen, Spring etsii @ExceptionHandler-merkinnällä varustetun menetelmän, joka voi käsitellä poikkeuksen. Jos on, menetelmää kutsutaan ja sen vastaus palautetaan.

Ilmoitus

当使用@ControllerAdvice时,我们需要将@ResponseBody添加到异常处理方法上。
如果我们使用@RestControllerAdvice,就不需要添加。

1. Määritä liiketoiminnan poikkeusluokat

Yhdistetyt poikkeusluokat voivat auttaa sinua hallitsemaan paremmin virheitä ja poikkeuksia, mikä tekee virheiden käsittelystä koko järjestelmän johdonmukaisempaa ja ennakoitavampaa.

public class BusinessException extends RuntimeException{

    private final ResultEnum resultEnum;

    public BusinessException(ResultEnum resultEnum, String message) {
        super(message);
        this.resultEnum = resultEnum;
    }

    public BusinessException(ResultEnum resultEnum) {
        this(resultEnum, resultEnum.message);
    }


}

2. Globaali poikkeuskäsittelijä

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler({BusinessException.class})
    public ResponseResult handleBusinessException(BusinessException businessException, HttpServletRequest request) {
        // 想处理的业务
        return ResponseResult.error(ResultEnum.SERVICE_ERROR, businessException.getMessage());
    }

    /**
     * 其他异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public ResponseResult handleOtherExceptions(Exception e) {
        // 这里可以根据不同的异常类型返回不同的状态码和消息
        // 但为了简单起见,这里只返回一个通用的错误信息
        return ResponseResult.error(ResultEnum.SERVICE_ERROR);
    }

}

3. Yhtenäinen käsittely ja käyttö

@GetMapping("/testException1")
    public ResponseResult test1() {
        if (true) {
            // 业务场景
            throw new BusinessException(ResultEnum.SERVICE_ERROR);
        }

        return ResponseResult.success("success");
    }

Yhtenäisen poikkeuskäsittelyn käytön edut

koodin uudelleenkäyttö: Vältä samanlaisten vastaustulosten ja poikkeusten käsittelykoodien kirjoittamista useisiin paikkoihin.

Helppo huoltaa: Kun haluat muokata vastausmuotoa tai poikkeuksenkäsittelylogiikkaa, sinun tarvitsee muokata sitä vain yhdessä paikassa.

Ryhmätyö: Tiimin jäsenet voivat helpommin ymmärtää ja noudattaa yhtenäisiä koodausstandardeja.

Skaalautuvuus: Jos haluat lisätä uusia vastaustyyppejä tai poikkeusten käsittelylogiikkaa, laajenna olemassa olevia.