【发布时间】:2021-09-25 19:46:21
【问题描述】:
我是 Spring Boot 新手,需要您的帮助。
我使用 WebClient 发出 GET 请求,我收到如下 JSON 正文:
{
"status": "OK",
"error": [],
"payload": {
"name": "John",
"surname": "Doe"
...
}
}
所以我有一个 DTO 类来映射响应。像这样的:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResponseAccountDTO {
private String status;
private List<ErrorDTO> errors;
private User payload;
}
我用这个方法做的:
public ResponseUserDTO retrieveUserById(String userId) {
return webClient.get()
.uri(GET_USER_BY_ID_V4, accountId)
.header("Auth-Schema", AUTH_SCHEMA)
.header("apikey", API_KEY)
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.onStatus(HttpStatus::is4xxClientError, response -> {
System.out.println("4xx error");
return Mono.error(new RuntimeException("4xx"));
})
.onStatus(HttpStatus::is5xxServerError, response -> {
System.out.println("5xx error");
return Mono.error(new RuntimeException("5xx"));
})
.bodyToMono(ResponseDTO.class)
.block();
}
最后我用这个方法测试一下:
UserRestClient userRestClient = new UserRestClient(webClient);
@Test
void retrieveUser() {
ResponseDTO response = userRestClient.retrieveUserById("123");
UserDTO user = response.getPayload();
System.out.println("user surname: " + user.surname);
assertEquals("Doe", user.getSurname());
}
一切正常,直到响应具有 KO 状态。如果出现问题(即 BAD REQUEST),我会收到相同的正文 JSON 结构,如下所示:
{
"status": "KO",
"errors": [
{
"code": "ER000",
"description": "Wrong ID parameter",
"params": ""
}
],
"payload": {}
}
有没有办法将我的 DTO 类上的 JSON 主体也与 KO 状态一起映射? 我想在我的 retrieveUser() 方法上返回错误描述。
更新: 我按照 Seelenvirtuose 的建议添加了我的 ErrorDTO 类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ErrorDTO {
private String code;
private String description;
private String params;
}
【问题讨论】:
-
您的 DTO 类似乎能够容纳整个 JSON 结构(如果
ErrorDTO设计良好)。你有什么问题? -
嗨 Seelen,我刚刚添加了我的课程 ErrorDTO 代码。问题是当我收到错误时,它会出现在这里
.onStatus(HttpStatus::is4xxClientError, response -> { -
我真的不明白。这段代码有什么问题?请添加任何错误或任何可能适合您的问题的问题描述。如果您不想对错误状态做出反应,那么就不要调用
onStatus方法。 -
如果我不调用 onStatus 则会引发错误并且永远不会到达方法的结尾,因此我的 ErrorDTO 中没有数据
-
抛出什么错误?
标签: java json error-handling spring-webclient