Java Spring ExceptionHandler,但用于普通bean

Java Spring ExceptionHandler,但用于普通bean,java,spring,exception,Java,Spring,Exception,我已经能够在Spring项目的控制器类中成功地使用@ExceptionHandler注释化方法org.springframework.web.bind.annotation.ExceptionHandler,来处理Spring@RestController 工作示例: @Validated @RestController @RequestMapping(value = UrlsProperties.API_PATH, produces = MediaType.APPLICATION_JSON,

我已经能够在Spring项目的控制器类中成功地使用
@ExceptionHandler
注释化方法
org.springframework.web.bind.annotation.ExceptionHandler
,来处理Spring
@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抛出的异常?

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

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


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

当应用于普通bean时,“处理异常”是什么意思?例如,如果一个bean应该返回一些
long
,但却抛出了一个异常,那么您将如何在exceptoin处理程序中“处理”它呢;类似于
@组件
@服务
类。类本身不返回值,它们有几个方法,每个方法都可能返回一些东西。在我的例子中,有几个方法可能在这个
bean
类中抛出相同类型的异常。如果它是一个
@Controller
bean,它就可以工作,否则就不行。好的,在我的原始评论中将“bean”替换为“bean方法调用”。然后再说一次:如果bean方法抛出而不是返回值,那么在异常处理程序中您会怎么做?你想隐藏它抛出的事实吗?那么返回值是多少呢?我承认,有些听起来确实像是AOP的后遗症。也许可以尝试这样做。只是想澄清一下:
后序
不是异常处理程序。这是一个在抛出异常时运行的操作,但它不允许任何恢复,就像一个适当的异常处理程序一样。