【问题标题】:Micronaut ExceptionHandler: create HttpResponse with status code and bodyMicronaut ExceptionHandler:使用状态码和正文创建 HttpResponse
【发布时间】:2019-08-05 19:44:06
【问题描述】:

在我的 Micronaut 应用程序中,我定义了一个 ExceptionHandler,它应该捕获 WorkflowException 并返回一个带有状态码 412 和 WorkflowExceptionVM 作为正文的 HttpResponse

这是我当前的实现:

@Produces
@Singleton
@Requires(classes = [WorkflowException::class, ExceptionHandler::class])
class WorkflowExceptionHandler : ExceptionHandler<WorkflowException, HttpResponse<WorkflowExceptionVM>> {

    override fun handle(request: HttpRequest<Any>, exception: WorkflowException): HttpResponse<WorkflowExceptionVM> {
        return HttpResponse.status<WorkflowExceptionVM>(HttpStatus.PRECONDITION_FAILED)
                .body(WorkflowExceptionVM(exception.code))
    }
}

它使用正确的代码生成响应,但不包括正文。

这是我的测试:

@Test
fun `Should handle WorkflowException`() {
    val request = POST(THE_URL, THE_BODY).basicAuth("user", "password")
    val exception = shouldThrow<HttpClientResponseException>
        {client.toBlocking().exchange(request, MyEntity::class.java) }

    exception.response.code() shouldBe 412 // This works
    exception.response.body() // ERROR: this is null
}


如何将正文添加到响应中?

【问题讨论】:

    标签: kotlin micronaut


    【解决方案1】:

    要获取错误正文,您需要使用 3 个参数 exchange 方法,其中第 3 个参数是错误类型:https://docs.micronaut.io/1.2.x/api/io/micronaut/http/client/DefaultHttpClient.html#exchange-io.micronaut.http.HttpRequest-io.micronaut.core.type.Argument-io.micronaut.core.type.Argument-

    所以,你的代码应该是:

    val exception = shouldThrow<HttpClientResponseException>
            {client.toBlocking().exchange(request, MyEntity::class.java, WorkflowExceptionVM::class.java) }
    

    我不能 100% 确定这是否适用于 Kotlin,因为在 Java 中,您需要将 bodyTypeerrorType 包装在 Argument 中。 如果它不起作用,请尝试:

    val exception = shouldThrow<HttpClientResponseException>
            {client.toBlocking().exchange(request, Argument.of(MyEntity::class.java), Argument.of(WorkflowExceptionVM::class.java)) }
    

    更新: 从异常中提取主体使用exception.getResponse().getBody(WorkflowExceptionVM::class.java)。这将返回一个Optional,因此您可以检查主体是否存在并获取它并检查WorkflowExceptionVM 上的任何属性。

    【讨论】:

    • 谢谢!您说得对,问题出在测试代码中(我与 Postman 核实了错误主体实际上是按预期存在的)。您的第一个代码示例无法编译。仅添加预期的主体类型而不将其包装到 Argument.of() 中可以正常工作,但如果错误类型也存在,则两者都必须被包装。第二个示例编译,但正文仍然像以前一样为空。
    • 我已经更新了我的回答者如何提取到正文。同样,请记住它可能无法直接在 Kotlin 中编译,我只是在“翻译”等效的 Java 代码(实际上是 Groovy,因为我使用 Spock 进行测试)
    猜你喜欢
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 2020-04-05
    相关资源
    最近更新 更多