如果异常是从不同的控制器生成的,则使用@controlleradvice和@exceptionhandler对同一异常进行不同的响应

时间:2019-04-01 10:24:45

标签: spring-boot exception

有2个不同的控制器,一个是提货控制器,另一个是交付控制器,我希望无论从哪个控制器生成异常,例如IOException / BadRequestException类,@ControllerAdvice类应根据从中生成异常的控制器类给出不同的响应。就像对于相同的BadRequestException对于分拣控制器类的不同响应,对于交付控制器类的不同响应

1 个答案:

答案 0 :(得分:0)

只是总结一下当您有两个不同的控制器抛出相同的异常并且您希望每个控制器以不同的方式处理该异常时的可能设置。

设置1:

在每个控制器中创建单独的@ExceptionHandler方法。如果您只想为该控制器处理异常并且没有设置@ControllerAdvice会覆盖此异常,则建议使用。

@RestController
@RequestMapping("/pickup")
public class PickupController {

    @ExceptionHandler(Exception.class)
    protected ResponseEntity<Error> handleException(Exception ex) {
        ...
    }
}

@RestController
@RequestMapping("/delivery")
public class DeliveryController {

    @ExceptionHandler(Exception.class)
    protected ResponseEntity<Error> handleException(Exception ex) {
        ...
    }
}

设置2: 为每个控制器创建@ControllerAdvice。如果您的@ControllerAdvice与控制器处理的异常相同(可能位于某些无法更改的库中),则建议使用。这样,您将可以在@Order上设置@ControllerAdvice并将其设置为主。

@ControllerAdvice(assignableTypes = PickupController.class)
@Order(Ordered.HIGHEST_PRECEDENCE)
public class PickupExceptionHandler {

    @ExceptionHandler(Exception.class)
    protected ResponseEntity<Error> handleException(Exception ex) {
        ...
    }
}

@ControllerAdvice(assignableTypes = DeliveryController.class)
@Order(Ordered.HIGHEST_PRECEDENCE)
public class DeliveryExceptionHandler {

    @ExceptionHandler(Exception.class)
    protected ResponseEntity<Error> handleException(Exception ex) {
        ...
    }
}