异常处理程序不使用`spring-boot-starter-data-rest`

时间:2015-10-25 08:04:39

标签: java spring rest spring-mvc kotlin

我的最后一次Java / Spring体验大约四年前。我已经开始用Kotlin学习Spring Boot了。

我已经像这样创建了一个RESTful Web服务(在Kotlin中),并且工作正常:

@RequestMapping("/authorization")
public fun authorization(@RequestParam(value = "network-type", defaultValue = "Facebook") name: String,
                         @RequestParam(value = "oauth-token") oauthToken: String,
                         @RequestParam(value = "oauth-token-secret",
                                 required = false) oauthTokenSecret: String?): Authorization
{
    //TODO: Handle other social network types
    return facebookAuth.authorization(oauthToken)
}

现在我无法在facebookAuth抛出UnauthorizedException时添加异常处理程序。

我尝试了什么:

  • 我尝试在控制器上注册异常处理程序方法。
  • 我尝试创建使用@ControllerAdvice
  • 注释的横切异常顾问类

在这两种情况下,都没有映射异常,而是得到:

Whitelabel错误页面

此应用程序没有/ error的显式映射,因此您将此视为后备。

Sun Oct 25 16:00:43 PHT 2015
There was an unexpected error (type=Internal Server Error, status=500).
Invalid OAuth access token.

问题:

使用Spring Boot注册可以返回序列化ErrorResponse对象的异常处理程序的正确方法是什么。

1 个答案:

答案 0 :(得分:0)

我能够通过注册以下异常处理程序来实现它:

@ControllerAdvice
public class ExceptionHandler : ResponseEntityExceptionHandler()
{

    @ExceptionHandler(Throwable::class)
    @ResponseBody
    internal fun onException(ex: Throwable): ErrorResponse
    {
        //TODO: Replace instanceof with polymorphism
        var responseCode = ResponseCode.VAMPServiceError
        if (ex is UnauthorizedException) {
            responseCode = ResponseCode.VAMPUnauthorized
        }

        val errorResponse = ErrorResponse(
            response = ResponseHeader(responseCode, ex.message))
        return errorResponse
    }
}

这是基于另一个StackOverflow anwer(我已经失去了)。在该答案中,答案建议在处理程序中包含@EnableWebMVC。我发现在我的情况下这并不是必要的"