gpt4 book ai didi

java - 空 JSON 响应不会在 Jackson 中触发错误

转载 作者:行者123 更新时间:2023-11-30 03:36:40 25 4
gpt4 key购买 nike

我正在使用 Jackson 来解释来 self 正在编写的 API 的 JSON 响应。我希望,作为整个 API 的标准,将错误从 API 抛出到程序,如下所示:

{"errorMessage":"No such username."}

因此,我希望我的响应处理器首先检查响应是否只是一个 errorMessage 键,如果是,则处理错误,如果不是,则将其解释为该命令期望的任何响应。

这是我的代码:

public class ProcessingException extends Exception {
private String errorMessage;
public ProcessingException(){}

public String getErrorMessage() {
return errorMessage;
}

public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}

}

然后,在我的响应处理程序中:

@Override
public void useResponse(InputStream in) throws IOException, ProcessingException {
// turn response into a string
java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\A");
String response = s.hasNext() ? s.next() : "";

ProcessingException exception;
try {
// Attempt to interpret as an exception
exception = mapper.readValue(response, ProcessingException.class);
}
catch(IOException e) {
// Otherwise interpret it as expected. responseType() is an abstract TypeReference
// which is filled in by subclasses. useResponse() is also abstract. Each subclass
// represents a different kind of request.
Object responseObj = mapper.readValue(response, responseType());
useResponse(responseObj);
return;
}
// I needed this out of the try/catch clause because listener.errorResponse might
// actually choose to throw the passed exception to be dealt with by a higher
// authority.
if (listener!=null) listener.errorResponse(exception);
}

这工作得很好,除了在一种情况下 - 有些请求实际上不需要响应任何内容,因此它们返回 {} 。由于某种原因,这个回应完全贯穿了exception = mapper.readValue(response, ProcessingException.class);行而没有触发 IOException,因此程序认为存在错误。但是当它尝试读取错误是什么时,它会抛出 NullPointerException当尝试阅读exception.getErrorMessage()时,因为当然没有错误。

为什么要治疗{}作为有效的ProcessingException对象?

最佳答案

Jackson 没有 Bean 验证。但是您可以做的是将构造函数声明为 JsonCreator,它将用于实例化新对象并检查/抛出异常,以防该字段为 null:

class ProcessingException  {
private String errorMessage;

@JsonCreator
public ProcessingException(@JsonProperty("errorMessage") String errorMessage) {
if (errorMessage == null) {
throw new IllegalArgumentException("'errorMessage' can't be null");
}
this.errorMessage = errorMessage;
}
// getters, setters and other methods
}

关于java - 空 JSON 响应不会在 Jackson 中触发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27734957/

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