Spring boot @ExceptionHandler не перехватывает исключение подкласса - PullRequest
0 голосов
/ 21 февраля 2020

Я сделал некоторый подкласс для обработки исключений. Метод генерирует исключение подкласса. Я сделал @ExceptionHandler как для суперкласса, так и для подклассов. Но только если нет обработки суперкласса исключений (handleSuperException (SuperclassExceptionexception e)), тогда исключения подкласса обрабатываются. SubClassAException, SubClassBException, SubClassCException расширяет SuperclassExceptionexception.

 public class Controller @PostMapping("/path/") {
       public ResponseEntity<String> method() throws   SuperclassException{
 }
    @ExceptionHandler(SuperclassException.class)   
public ResponseEntity handleSuperException(SuperclassExceptionexception e) {
       //hadle superclass related
    }

 @ExceptionHandler({SubClassAException.class, SubClassBException.class, SubClassCException.class}) 
public ResponseEntity handleSubClassException(SuperclassExceptionexception e) {
//handle more specific
}

Но оно никогда не переходит к handleSubClassException, даже если генерируются исключения подкласса.

1 Ответ

2 голосов
/ 21 февраля 2020

Невозможно воспроизвести!

Вот Минимальный воспроизводимый пример , протестирован с Spring Boot 2.2.0 (Spring 5.2.0).

package web.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class FailController {

    @GetMapping("/dmz/fail")
    public String failSuper() {
        throw new SuperclassException("failSuper()");
    }

    @GetMapping("/dmz/failA")
    public String failA() {
        throw new SubClassAException("failA()");
    }

    @GetMapping("/dmz/failB")
    public String failB() {
        throw new SubClassBException("failB()");
    }

    @ExceptionHandler(SuperclassException.class)
    public ResponseEntity<?> handleSuperException(SuperclassException e) {
        return ResponseEntity.badRequest().body("handleSuperException: " + e);
    }

    @ExceptionHandler({SubClassAException.class, SubClassBException.class}) 
    public ResponseEntity<?> handleSubClassException(SuperclassException e) {
        return ResponseEntity.badRequest().body("handleSubClassException: " + e);
    }

}

class SuperclassException extends RuntimeException {
    public SuperclassException(String message) {
        super(message);
    }
}

class SubClassAException extends SuperclassException {
    public SubClassAException(String message) {
        super(message);
    }
}

class SubClassBException extends SuperclassException {
    public SubClassBException(String message) {
        super(message);
    }
}

Я использую /dmz/, поэтому настройка Spring Security не требует входа в систему. В простой ванильной установке Spring Boot это, конечно, не понадобится.

Выход (http://localhost:8080/dmz/fail)

handleSuperException: web.controller.SuperclassException: failSuper()

Выход (http://localhost:8080/dmz/failA)

handleSubClassException: web.controller.SubClassAException: failA()

Выход (http://localhost:8080/dmz/failB)

handleSubClassException: web.controller.SubClassBException: failB()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...