在来自Web服务的不可预测的响应中使用Optional

时间:2019-07-16 02:08:37

标签: exception java-8 jackson optional

我正在使用Web服务执行某些任务。我在解析提供的一种API的响应时遇到问题,在不同情况下,响应如下。两种情况的响应码都是200。

  • 字符串(不是JSON),如果在其数据库中找不到记录或在请求URL中传递的API版本无效。
  • 响应成功时(即在大多数情况下)的JSON

因此,我采用以下方法来解决此解析问题。我的疑问是,在这种情况下使用Optional是否正确?

// inside json parse utlity method
try {
    // success
    return Optional.of(objectMapper.readValue(responseBody, MyObject.class));
} catch(JsonParseException e) {
    // when the response is not JSON. That is a `String`
    return Optional.empty();
} catch(Exception e) {
    throw new RuntimeException(e);
}

// do other stuff if value is present in Optional, otherwise skip

我正在使用杰克逊库和Spring Boot REST服务。如果有更好的方法,请帮助我。

1 个答案:

答案 0 :(得分:0)

如果您不打算使用该“字符串”,则可以在此处使用Optional。但是大多数情况下,最好将错误传播到整个链上,以便其他代码可以对它进行一些有用的操作,例如将其记录或重试或向用户显示错误。

如果您可能需要在某个地方使用该错误字符串,则可以创建类似以下的类:

public class ResponseWrapper {

    private Response response;
    private String error;

    public ResponseWrapper(Response response) {
        this.response = response;
    }

    public ResponseWrapper(String error) {
        this.error = error;
    }

    //getters
}

使您的解析实用程序方法返回ResponseWrapper

在您的JsonParseException catch块中:

return new ResponseWrapper(responseBody); //this will set the error

否则,如果它是有效的json:

return new ResponseWrapper(objectMapper.readValue(responseBody, Response.class));

这样,方法的调用者可以检查是否有任何错误(字符串)或有效的响应。


另一种方法是在您的JsonParseException catch块内throw new CustomException(responseBody);。这样,此方法的调用者可以使用e.getMessage()获取字符串错误。如果它是有效的json,则只需返回objectMapper.readValue(responseBody, MyObject.class)