Micronaut ExceptionHandler:使用状态代码和正文创建HttpResponse

时间:2019-08-05 19:44:06

标签: kotlin micronaut

在Micronaut应用程序中,我定义了一个ExceptionHandler,该WorkflowException应该捕获HttpResponse并返回一个带有状态代码412且以WorkflowExceptionVM为主体的@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
}


它会生成带有正确代码的响应,但不包括正文。

这是我的考试:

views.py

如何在响应中添加正文?

1 个答案:

答案 0 :(得分: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上的任何属性。