首页 > 解决方案 > Spring ExceptionHandler 但对于普通bean

问题描述

我已经能够在我的 Spring 项目的控制器类中成功使用@ExceptionHandler带注释的方法来处理 spring 抛出的异常org.springframework.web.bind.annotation.ExceptionHandler@RestController

工作示例:

@Validated
@RestController
@RequestMapping(value = UrlsProperties.API_PATH, produces = MediaType.APPLICATION_JSON, consumes = { MediaType.APPLICATION_JSON })
@Api(value = "MyController", description = "MyController processing and forwarding controller")
public class MyController  {

    private static Logger log = LogManager.getLogger(MyController.class);

    ...

    @JsonFormat
    @ExceptionHandler(MissingServletRequestParameterException.class)
    public ResponseMessage handleMissingParams(MissingServletRequestParameterException ex) {

        String name = ex.getParameterName();
        log.error(name + " parameter is missing");
        return new ResponseMessage(400, ex.getMessage());
    }
}

我正在尝试实现相同的异常处理方式,但对于普通 bean,[不是控制器]。简单地添加一个带@ExceptionHanlder注释的方法似乎并没有捕获该 bean 的方法抛出的异常。

我的问题是如何通过在这个bean中编写一个方法来处理一个bean抛出的异常?

标签: javaspringexception

解决方案


@ExceptionHandler注释不适用于一般异常处理。它在控制器中用于将异常转换为正确的 HTTP 响应。它不适用于普通 bean,因为只有控制器返回响应。

如果任何代码(不需要在 bean 中)抛出异常并且您不处理它,它最终会传播到控制器的异常处理程序,并将转换为响应。但这将是糟糕的设计,因为您应该尽早处理异常。

您可以做的是创建旨在传播到您的异常处理程序的异常。您的代码捕获一个异常,然后将其重新抛出到您自己的异常中(例如IllegalRequestException)。然后,处理程序将错误代码和详细信息返回给调用者。


推荐阅读