グローバルなエラーハンドラがカスタムコンバータ内でスローされた例外をキャッチしないSpring(およびkotlin?)の問題に直面しています。スプリングフレームワークでカスタムコンバータの例外が発生する
私はspringサポートstring - > UUIDのマッピングをデフォルトで知っていますが、実際に例外がスローされたかどうかを明示的に確認したいと考えました。それは次のコンバーターです。この動作は、自分でコンバータを実装しても実装しなくても同じです。次のように
私WebMvcConfugurationに見えます:
@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
class MyController : ApiBaseController() {
@GetMapping("/something/{id}")
fun getSomething(@PathVariable("id") id: UUID) {
throw NotImplementedError()
}
}
制御内の例外ler(例えばNotImplementedError)メソッドはうまく捕まえられます。しかし、無効なUUIDが渡されたときにコンバーター内でIllegalArgumentExceptionがスローされ、springが空の400応答を返します。
私の質問は次のとおりです:どのようにこれらのエラーをキャッチし、カスタムエラーメッセージで応答しますか?
ありがとうございます!他の人が継承BaseControllerを実装し、そこに働く例外ハンドラを追加し、代わりに@ControllerAdvice
を使用しての
:いくつかのより多くの試行錯誤の後
downvoteが高く評価されるだろう何のためにあるのかを説明。 –