java - 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抛出的异常?
解决方案
@ExceptionHandler
注释不适用于一般异常处理。它在控制器中用于将异常转换为正确的 HTTP 响应。它不适用于普通 bean,因为只有控制器返回响应。
如果任何代码(不需要在 bean 中)抛出异常并且您不处理它,它最终会传播到控制器的异常处理程序,并将转换为响应。但这将是糟糕的设计,因为您应该尽早处理异常。
您可以做的是创建旨在传播到您的异常处理程序的异常。您的代码捕获一个异常,然后将其重新抛出到您自己的异常中(例如IllegalRequestException
)。然后,处理程序将错误代码和详细信息返回给调用者。
推荐阅读
- assembly - 如何在汇编中创建函数?
- linux - 当我编译我的 C 项目时,它给了我“未定义的引用”
- android - 如何为 Flutter 应用创建自定义主题文件
- java - 设置由 TextChangedListener 调用的方法
- azure-aks - 在 Azure 中获取 kubectl 凭据
- angular - Angular FxFlex 布局
- assembly - 我无法真正理解问题的重点,因为我不在汇编程序上编程
- android - 更改为 targetSdkVersion 28 时,Flutter 中 FCM 的 Android 自定义通知声音不起作用
- python - 从另一个字典中的键值中选择键值对
- python - 找到达到 n 所需的最小步数