gpt4 book ai didi

httpresponse - 无法在 Microprofile Rest Client 中映射/获取 422 错误代码的响应实体

转载 作者:行者123 更新时间:2023-12-05 03:42:07 28 4
gpt4 key购买 nike

我有一个 API,当我通过 postman 调用它时,它会在以下情况下给出以下响应:

案例1:状态码:200

{"success": "student record is present",
"error": null}

案例2:状态码:422

{"success": null,
"error": "studentname should not contain numerics"}

我想通过使用 quarkus/java 项目的 microprofile restclient 实现上述两个案例的相同结果。所以创建了下面的类

Java DTO 类:

public class StudentResponse{

private String success;

private String error;

public String getSuccess() {
return success;
}

public void setSuccess(String success) {
this.success = success;
}

public String getError() {
return error;
}

public void setError(String error) {
this.error = error;
}

@Override
public String toString() {
return "StudentResponse [success=" + success + ", error=" + error + "]";
}

}

Rest-Client 类:

包 com.tatadigital.rest.service;

@RegisterRestClient(configKey = "student-client-api")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface StudentService {

@POST
@Path("/checkStudent")
StudentResponse checkStudent(@RequestBody StudentCheck studentCheck);
}

最后,我通过应用程序对其进行了测试,对于案例 1,按预期收到了状态码为 200 的响应正文。但是对于 case-2,因为状态代码是 422,异常被抛出并得到处理,但是在异常对象中我们有响应对象,在它里面我们有响应实体。此响应实体为空,甚至 studentResponse 也为空。我想在 422 状态代码案例中获取错误消息(json 响应)和 microprofile rest 客户端案例。有什么方法/建议可以实现这一点?

最佳答案

编辑

您还可以通过添加
从 DefaultResponseExceptionMapper 实现相同的行为resteasy.original.webapplicationexception.behavior=true
在 application.properties 中。

当该选项为false时,DefaultResponseExceptionMapper会根据HTTP状态码包装WebApplicationException并返回异常,例如

} else if (e instanceof BadRequestException) {
return new ResteasyBadRequestException((BadRequestException)e);
}

其中不包含响应中的实体。

如果启用原始行为,异常将按原样返回,并且响应实体可供您阅读。

wae.getResponse().readEntity(StudentResponse.class);


在状态代码 >=400 的情况下,将抛出包含 Response 对象的 WebApplicationException,但由 DefaultResponseExceptionMapper 处理。

创建自定义异常映射器并抛出仅包含响应的 WebApplicationException

public class HttpExceptionMapper implements ResponseExceptionMapper<Throwable> {

@Override
public Throwable toThrowable(Response response) {
throw new WebApplicationException(response);
}

}

使用适当的注释将映射器注册到您的休息客户端@RegisterProvider(HttpExceptionMapper.class)

您将能够阅读响应中的实体

StudentResponse studentResponse;
try {
studentResponse = checkStudent(studentCheck);
} catch(WebApplicationException wae) {
studentResponse = wae.getResponse().readEntity(StudentResponse.class);
}

关于httpresponse - 无法在 Microprofile Rest Client 中映射/获取 422 错误代码的响应实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67384625/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com