在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
如何在响应中添加正文?
答案 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中,您需要将bodyType
和errorType
包装在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
上的任何属性。