Heim  >  Artikel  >  Java  >  So lösen Sie das globale Ausnahmeproblem von SpringBoot

So lösen Sie das globale Ausnahmeproblem von SpringBoot

王林
王林nach vorne
2023-05-16 10:49:121550Durchsuche

SpringBoot ist ein Produkt, das eine Reihe von Aufgaben wie das Erstellen, Ausführen, Debuggen und Bereitstellen von Spring-Anwendungen vereinfacht. Die Funktion der automatischen Assemblierung ermöglicht es uns, uns besser auf das Geschäft selbst zu konzentrieren und nicht nur auf die externe XML-Konfiguration Wenn Sie die Spezifikationen befolgen müssen, können Sie problemlos ein WEB-Projekt erstellen, indem Sie relevante Abhängigkeiten einführen.

Bei der tatsächlichen Projektentwicklung treten häufig verschiedene abnormale Situationen im Programm auf, insbesondere als serverseitige Entwickler sind wir ständig dabei, Schnittstellen zu schreiben, um sie bereitzustellen -Endaufrufe, und im Falle von Arbeitsteilung und Zusammenarbeit können Ausnahmen nicht vermieden werden, wenn dem Benutzer die falschen Informationen direkt angezeigt werden, kann man sich die Erfahrung vorstellen, und für Hacker werden oft detaillierte Ausnahmeinformationen bereitgestellt Sehr hilfreich. ..

Verwenden Sie die Try-Catch-Methode, um Ausnahmeinformationen manuell zu erfassen und dann die entsprechende Ergebnismenge zurückzugeben. Ich glaube, viele Leute haben einen ähnlichen Code gesehen (z. B.: Eingekapselt in ein Ergebnisobjekt). Problem der Fehleranfälligkeit, die gleichen Nachteile sind ebenfalls offensichtlich. Wenn es zu viele Ausnahmen gibt, wird es immer schwieriger, die Beziehung zwischen diesen Geschäftsausnahmen und Fehlercodes zu verwalten. Passend, daher ist der beste Weg, die globale Kontrolle durch einfache Konfiguration zu übernehmen ...

Werfen wir einen Blick auf die von Spring Boot bereitgestellte Lösung

1 Importabhängigkeiten

Fügen Sie spring-boot-starter-web in pom.xml hinzu Verlassen Sie sich auf

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

Benutzerdefinierte Ausnahmen
Zusätzlich zu den Ausnahmen des Systems selbst sind auch die in verschiedenen Geschäftsszenarien verwendeten Ausnahmen unterschiedlich, um dem Titel „Easy Get Global Exceptions“ mehr Relevanz zu verleihen. Definieren Sie Ihre eigene Ausnahme, sehen Sie, wie Sie erfassen ...

package com.battcn.exception;

/**
 * 自定义异常
 *
 * @author Levin
 * @since
public class CustomException extends RuntimeException

    private static final long serialVersionUID = 4564124491192825748L;

    private int code;

    public CustomException() {
        super();
    }

    public CustomException(int code, String message) {
        super(message);
        this.setCode(code);
    }

    public int getCode() {
        return code;
    }

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

2 Vorlage für Ausnahmeinformationen

Definieren Sie das Format der zurückgegebenen Ausnahmeinformationen, damit der Ausnahmeinformationsstil einheitlicher ist

package com.battcn.exception;

/**
 * @author Levin
 * @since
public class ErrorResponseEntity

    private int code;
    private String message;
    // 省略 get set

3 Kontrollebene

Gehen Sie genauer hin Schauen Sie, ob es keinen Unterschied im Code gibt, keine Sorge, lesen Sie weiter...

package com.battcn.controller;

import com.battcn.exception.CustomException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * 全局异常演示
 *
 * @author Levin
 * @since
@RestController
public class ExceptionController

    @GetMapping("/test3")
    public String test3(Integer num) {
        // TODO 演示需要,实际上参数是否为空通过 @RequestParam(required = true)  就可以控制
        if (num == null) {
            throw new CustomException(400, "num不能为空");
        }
        int i = 10 / num;
        return "result:"

4 Ausnahmebehandlung (Schlüssel)

Anmerkungsübersicht:

  • @ControllerAdviceCatch Die von der Controller-Ebene ausgelöste Ausnahme. Wenn @ResponseBody hinzugefügt wird, liegen die Rückgabeinformationen im JSON-Format vor.

  • @RestControllerAdvice entspricht der Kombination aus @ControllerAdvice und @ResponseBody.

  • @ExceptionHandlerBehandelt einen Ausnahmetyp einheitlich und reduziert so die Codeduplizierung und -komplexität.

Erstellen Sie eine GlobalExceptionHandler-Klasse und fügen Sie die Annotation @RestControllerAdvice hinzu, um die Ausnahmebenachrichtigungsklasse zu definieren. Fügen Sie dann @ExceptionHandler zur definierten Methode hinzu, um die Ausnahme zu erfassen ...

package com.battcn.config;

import com.battcn.exception.CustomException;
import com.battcn.exception.ErrorResponseEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 全局异常处理
 *
 * @author Levin
 * @since
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler


    /**
     * 定义要捕获的异常 可以多个 @ExceptionHandler({})
     *
     * @param request  request
     * @param e        exception
     * @param response response
     * @return
    @ExceptionHandler(CustomException.class)
    public ErrorResponseEntity customExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {
        response.setStatus(HttpStatus.BAD_REQUEST.value());
        CustomException exception = (CustomException) e;
        return new ErrorResponseEntity(exception.getCode(), exception.getMessage());
    }

    /**
     * 捕获  RuntimeException 异常
     * TODO  如果你觉得在一个 exceptionHandler 通过  if (e instanceof xxxException) 太麻烦
     * TODO  那么你还可以自己写多个不同的 exceptionHandler 处理不同异常
     *
     * @param request  request
     * @param e        exception
     * @param response response
     * @return
    @ExceptionHandler(RuntimeException.class)
    public ErrorResponseEntity runtimeExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {
        response.setStatus(HttpStatus.BAD_REQUEST.value());
        RuntimeException exception = (RuntimeException) e;
        return new ErrorResponseEntity(400, exception.getMessage());
    }

    /**
     * 通用的接口映射异常处理方
     */
    @Override
    protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers,
                                                             HttpStatus status, WebRequest request) {
        if (ex instanceof MethodArgumentNotValidException) {
            MethodArgumentNotValidException exception = (MethodArgumentNotValidException) ex;
            return new ResponseEntity<>(new ErrorResponseEntity(status.value(), exception.getBindingResult().getAllErrors().get(0).getDefaultMessage()), status);
        }
        if (ex instanceof MethodArgumentTypeMismatchException) {
            MethodArgumentTypeMismatchException exception = (MethodArgumentTypeMismatchException) ex;
            logger.error("参数转换失败,方法:" + exception.getParameter().getMethod().getName() + ",参数:" + exception.getName()
                    + ",信息:" + exception.getLocalizedMessage());
            return new ResponseEntity<>(new ErrorResponseEntity(status.value(), "参数转换失败"), status);
        }
        return new ResponseEntity<>(new ErrorResponseEntity(status.value(), "参数转换失败"), status);
    }
}

Test

Schließen Sie die Vorbereitungen ab. Beginnen Sie schließlich mit der Anwendung von Kapitel 17. Anhand der folgenden Testergebnisse können Sie erkennen, dass es wirklich so einfach ist. Der Code ist sauberer geworden und die Skalierbarkeit hat sich verbessert...

Besuchen Sie http://localhost:8080/test3

{"code":400,"message":"num不能为空"}

Besuchen Sie http://localhost :8080/test3?num=0

{"code":400,"message":"/ by zero"}

Besuchen Sie http://localhost:8080/test3?num=5

result:2

Das obige ist der detaillierte Inhalt vonSo lösen Sie das globale Ausnahmeproblem von SpringBoot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen