为了简化我的错误处理,我想要一个ExceptionHandler,我使用了http://www.baeldung.com/exception-handling-for-rest-with-spring上的4.点。
我的异常处理程序类如下所示:
@ControllerAdvice
class APIExceptionHandler : ResponseEntityExceptionHandler() {
@ExceptionHandler(value = [(TestException::class)])
fun handleConflict(exception: TestException, request: WebRequest): ResponseEntity<Any> {
println("Handle")
return handleExceptionInternal(exception, "Response Body", HttpHeaders(), HttpStatus.BAD_REQUEST, request)
}
}
TestException
只是一个简单的Exception
,可以扩展RuntimeException
class TestException : RuntimeException()
无论如何,在我的RestController
中,我只是在发出任何电话后立即抛出异常:
@GetMapping("/lobby/close")
fun closeLobby(@RequestParam(value = "uuid") uuid: String, @RequestHeader(value = "userSession") userSession: String): ResponseEntity<Any> {
throw TestException()
}
但是没有调用异常处理程序。
然而,请致电:
@GetMapping("/lobby/error")
fun error(): ResponseEntity<Any> {
throw TestException()
}
它被调用。
除了第一个期望参数和特定标题的版本之外,我不太明白它的区别。
更新24.03.2018
问题似乎是,如果客户端请求格式不正确,则不会调用ExceptionHandler。
默认情况下,格式错误的请求会生成非常详细的错误报告,但自定义ExceptionHandler似乎会禁用此功能。
答案 0 :(得分:1)
我成功了,这是我的代码。
@ControllerAdvice
class ControllerAdviceRequestError : ResponseEntityExceptionHandler() {
@ExceptionHandler(value = [(UserAlreadyExistsException::class)])
fun handleUserAlreadyExists(ex: UserAlreadyExistsException,request: WebRequest): ResponseEntity<ErrorsDetails> {
val errorDetails = ErrorsDetails(Date(),
"Validation Failed",
ex.message!!
)
return ResponseEntity(errorDetails, HttpStatus.BAD_REQUEST)
}
}
异常类
class UserAlreadyExistsException(override val message: String?) : Exception(message)
数据类
data class ErrorsDetails(val time: Date, val message: String, val details: String)
MyController:
@PostMapping(value = ["/register"])
fun register(@Valid @RequestBody user: User): User {
if (userService.exists(user.username)) {
throw UserAlreadyExistsException("User with username ${user.username} already exists")
}
return userService.create(user)
}
答案 1 :(得分:0)
现在我有一个解决方案,即使这不应该是我想要的方式。
由于我的控制器无论如何都没有基类,我没有创建包含处理异常的函数的BaseController
,这些函数只是用ExceptionHandler
注释而且它们的方法列表包含{{1他们应该处理。
由于Exception
类没有扩展任何其他处理异常的Spring类,因此它不会覆盖处理格式错误请求等问题的默认行为。
我很乐意接受任何更好的解决方案,因为我不认为这应该是理想的方式。