Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin Micronaut ExceptionHandler:使用状态代码和正文创建HttpResponse_Kotlin_Micronaut - Fatal编程技术网

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

Kotlin Micronaut ExceptionHandler:使用状态代码和正文创建HttpResponse,kotlin,micronaut,Kotlin,Micronaut,在我的Micronaut应用程序中,我定义了一个ExceptionHandler,它应该捕获WorkflowException,并返回一个HttpResponse,状态代码为412,主体为WorkflowExceptionVM 以下是我当前的实现: @Produces @Singleton @Requires(classes = [WorkflowException::class, ExceptionHandler::class]) class WorkflowExceptionHandler

在我的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))
    }
}
@products
@独生子女
@需要(类=[WorkflowException::class,ExceptionHandler::class])
类WorkflowExceptionHandler:ExceptionHandler{
重写有趣的句柄(请求:HttpRequest,异常:WorkflowException):HttpResponse{
返回HttpResponse.status(HttpStatus.Premission\u失败)
.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
}


@测试
fun`应该处理WorkflowException`(){
val request=POST(URL,正文)。basicAuth(“用户”、“密码”)
val exception=shouldThrow
{client.toBlocking().exchange(请求,MyEntity::class.java)}
exception.response.code()应该是412//
exception.response.body()//错误:这是null
}

如何将主体添加到响应中?

要获取错误主体,需要使用3个参数
交换
方法,其中第3个参数是错误类型:

因此,您的代码应该是:

val exception = shouldThrow<HttpClientResponseException>
        {client.toBlocking().exchange(request, MyEntity::class.java, WorkflowExceptionVM::class.java) }
更新:
从异常中提取正文使用
exception.getResponse().getBody(WorkflowExceptionVM::class.java)
。这将返回一个
可选
,这样您就可以检查主体是否存在,并获取主体,以及检查
WorkflowExceptionVM
上的任何属性。谢谢!您是对的,问题出在测试代码中(我向Postman检查了错误主体是否如预期的那样存在)。您的第一个代码示例未编译。只添加所需的主体类型,而不将其包装到
Argument.of()
中可以正常工作,但如果错误类型也存在,则必须将两者包装。第二个示例已编译,但正文仍像以前一样为空。我已更新了answeser,介绍了如何提取到正文。同样,请记住它可能不会直接在Kotlin中编译,我只是“翻译”等价的Java代码(实际上是Groovy,因为我使用Spock进行测试)
val exception = shouldThrow<HttpClientResponseException>
        {client.toBlocking().exchange(request, Argument.of(MyEntity::class.java), Argument.of(WorkflowExceptionVM::class.java)) }