我正在使用Web服务执行某些任务。我在解析提供的一种API的响应时遇到问题,在不同情况下,响应如下。两种情况的响应码都是200。
因此,我采用以下方法来解决此解析问题。我的疑问是,在这种情况下使用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服务。如果有更好的方法,请帮助我。
答案 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)
。