我遇到了 Spring(和 kotlin?)的问题,我的全局错误处理程序无法捕获自定义转换器中引发的任何异常。
我知道 spring 默认支持 string->UUID 映射,但我想显式检查是否确实抛出异常。它就是下面的转换器。无论有没有我自己实现的转换器,行为都是相同的。
我的 WebMvcConfiguration 如下所示:
@Configuration
class WebMvcConfiguration : WebMvcConfigurerAdapter() {
override fun addFormatters(registry: FormatterRegistry) {
super.addFormatters(registry)
registry.addConverter(Converter<String, UUID> { str ->
try {
UUID.fromString(str)
} catch(e: IllegalArgumentException){
throw RuntimeException(e)
}
})
}
这是我的 GlobalExceptionHandler: (它还包含其他处理程序,为简洁起见,我省略了这些处理程序)
@ControllerAdvice
class GlobalExceptionHandler : ResponseEntityExceptionHandler() {
@ExceptionHandler(Exception::class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
fun handleException(ex: Exception): ApiError {
logger.info(ex.message, ex)
return ApiError(ex.message)
}
}
最后是 Controller :
@Controller
class MyController : ApiBaseController() {
@GetMapping("/something/{id}")
fun getSomething(@PathVariable("id") id: UUID) {
throw NotImplementedError()
}
}
Controller 内部的异常(例如 NotImplementedError)方法可以很好地捕获。但是当传递无效的 UUID 时转换器内抛出的 IllegalArgumentException 被吞掉,并且 spring 返回一个空的 400 响应。
我现在的问题是:如何捕获这些错误并使用自定义错误消息进行响应?
提前致谢!
最佳答案
我也遇到了同样的问题。 Spring 吞掉了任何 IllegalArgumentException
(在我的例子中为 ConversionFailedException
)。
为了获得我正在寻找的行为;即仅处理列出的异常并对其他异常使用默认行为,您不得扩展 ResponseEntityExceptionHandler
。
示例:
@ControllerAdvice
public class RestResponseEntityExceptionHandler{
@ExceptionHandler(value = {NotFoundException.class})
public ResponseEntity<Object> handleNotFound(NotFoundException e, WebRequest request){
return new ResponseEntity<>(e.getMessage(), new HttpHeaders(), HttpStatus.NOT_FOUND);
}
}
关于Spring框架吞掉了自定义转换器的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46426161/