【问题标题】:How to handle two data types coming in same response for same parameter name如何处理针对相同参数名称的相同响应中的两种数据类型
【发布时间】:2022-01-07 22:55:57
【问题描述】:

我正在调用一个第三方 API,它返回两个不同值的相同参数名称,如下所示,

    ActivationResponse activationResponse = new ActivationResponse();
ResponseEntity<ActivationResponse> response = null;
    response = restTemplate.exchange(Url, HttpMethod.POST, request, ActivationResponse.class);
    activationResponse = response.getBody();

错误响应:

    {
   "executionCode":"2",
   "executionMessage":"NullPointerException Occured!",
   "response":"java.lang.NullPointerException"
}

成功响应:

{
  "executionCode" : "0",
  "executionMessage" : "SUCCESS",
  "response" : {
    "orderID" : "79966036"
  }
}

作为示例响应,response 参数可以作为字符串或 JSON 对象出现。

目前响应模型如下,

public class ActivationResponse {

    private String executionCode;
    private String executionMessage;
    private ActivationResponseDetails response;
}

public class ActivationResponseDetails {
    private String orderID;
}

当错误来临时,抛出异常,表示无法处理response参数。请建议如何在没有问题的情况下处理成功和失败的情况。

请注意,answer 中的方法是不可能的,因为我必须按以下方式打印日志,所以使用@JsonIgnore 不会在日志中显示该参数。

日志是这样打印的,

log.info("ActivationResponse json : {}", mapper.writerWithDefaultPrettyPrinter().writeValueAsString(response.getBody()));

【问题讨论】:

  • 必须反序列化为单一类型吗?成功映射到 OkResponse 和错误映射到 ErrorResponse 是不可能的吗?
  • 澄清一下:出现问题是因为没有orderID?
  • @morsor 成功响应映射没有错误。但是错误响应给出了一个例外。我认为这是因为在错误情况下它期望一个 json 对象但接收一个字符串。
  • @SirHawrk 在错误场景中,“response”参数以字符串形式出现,而不是 json 对象。我想知道如何在不出现异常的情况下处理成功和错误情况
  • @cmb28:是的——我知道这就是问题所在。我的问题是您是否必须将所有响应映射到完全相同的结构?成功和错误映射到不同类型是完全正常的

标签: json spring-boot jackson


【解决方案1】:

如果您坚持使用一刀切的响应对象,将响应字段的类型设置为对象,可能会成功:

public class ActivationResponse {
    private String executionCode;
    private String executionMessage;
    private Object response;
}

“响应”字段现在应该解析为一个简单的字符串(成功)或更复杂的 Java 对象(错误)。

【讨论】:

  • 感谢您的回复。其实我想做相反的事情。将响应保持为“私人 ActivationResponseDetails 响应;”并忽略即将到来的字符串值
  • 你不能让你的调用者将成功响应映射到一个字符串,并将错误响应映射到 ActivationResponseDetails 吗?您能否解释一下为什么两个响应显然必须映射到同一个对象?
猜你喜欢
  • 2021-09-13
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
相关资源
最近更新 更多