Spring框架吞掉了自定义转换器的异常

标签 spring spring-mvc kotlin

我遇到了 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/

相关文章:

Spring自定义AuthenticationFailureHandler

spring - 在应用程序之间转移登录信息-Spring Security Core

java - < Spring :message> tag not working with resource bundles from database

java - 如何创建 Hibernate Pojo 和 hbm 文件

java - 无法向基于 Spring MVC 的 REST 服务发送多部分/混合请求

java - Spring @Transactional 方法错误处理

java - Spring Security,多个http元素。哪个是哪个?

collections - 如何从 “chunked” block 构建列表?

kotlin - 调用 Continuation.resumeX() 失败一定是个问题吗?

java - “public”函数公开其 'public/*package*/' 参数类型 SolarEdgeException