在 Jackson 反序列化期间验证 JSON 有效负载时如何抛出异常?
How to throw exception when validating JSON payloads during deserialisation in Jackson?
我正在创建自定义 Jackson 反序列化器 class 以将 JSON 有效负载映射到对象。在我的 deserialize
方法中,我对 JSON 有效负载进行了一些检查,以查看是否有任何字段丢失或与 POJO 不一致。
我尝试在 deserialize
方法中抛出异常,如下所示:
@Override
public MyObject deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
// if some fields are missing throw error:
throw new MissingFieldsException("name field is missing");
}
但是,我不允许在 deserialize
方法中抛出我自己的异常,因为该方法实现了一个接口,我只能抛出 IOException
和 JsonProcessingException
:
public abstract T deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException;
在这种情况下,如何在进行反序列化时验证 JSON 有效负载?
确切地说 class JsonProcessingException
不是 "protected"。 class 的构造函数是。因此,您可以轻松地扩展 class - 正如评论所建议的那样 - 使用一些 public 构造函数,例如:
@SuppressWarnings("serial")
public static class MyJsonProcessingException extends JsonProcessingException {
protected MyJsonProcessingException(String msg) {
super(msg);
}
}
您还可以通过为正文提供 new
运算符来将其声明为匿名内部 class。喜欢:
throw new JsonProcessingException("Error msg") {};
为此,您可能还想添加以下内容之一:
private static final long serialVersionUID = 1L;
在上述匿名内部 class 的正文中或将注释 @SuppressWarnings("serial")
添加到抛出此方法的方法中,以消除有关缺少序列号的警告。
通常你也可以抛出任何未经检查的异常,比如 RuntimeException
本身或类似的:
@SuppressWarnings("serial")
public static class MyJsonProcessingRuntimeException extends RuntimeException {}
但在 RuntimeException
的情况下,您需要在编码时更加小心 - 所以请注意它可以在没有任何声明的情况下抛出 - 因此扩展 JsonProcessingException
是更可取的,IMO。
我正在创建自定义 Jackson 反序列化器 class 以将 JSON 有效负载映射到对象。在我的 deserialize
方法中,我对 JSON 有效负载进行了一些检查,以查看是否有任何字段丢失或与 POJO 不一致。
我尝试在 deserialize
方法中抛出异常,如下所示:
@Override
public MyObject deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
// if some fields are missing throw error:
throw new MissingFieldsException("name field is missing");
}
但是,我不允许在 deserialize
方法中抛出我自己的异常,因为该方法实现了一个接口,我只能抛出 IOException
和 JsonProcessingException
:
public abstract T deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException;
在这种情况下,如何在进行反序列化时验证 JSON 有效负载?
确切地说 class JsonProcessingException
不是 "protected"。 class 的构造函数是。因此,您可以轻松地扩展 class - 正如评论所建议的那样 - 使用一些 public 构造函数,例如:
@SuppressWarnings("serial")
public static class MyJsonProcessingException extends JsonProcessingException {
protected MyJsonProcessingException(String msg) {
super(msg);
}
}
您还可以通过为正文提供 new
运算符来将其声明为匿名内部 class。喜欢:
throw new JsonProcessingException("Error msg") {};
为此,您可能还想添加以下内容之一:
private static final long serialVersionUID = 1L;
在上述匿名内部 class 的正文中或将注释 @SuppressWarnings("serial")
添加到抛出此方法的方法中,以消除有关缺少序列号的警告。
通常你也可以抛出任何未经检查的异常,比如 RuntimeException
本身或类似的:
@SuppressWarnings("serial")
public static class MyJsonProcessingRuntimeException extends RuntimeException {}
但在 RuntimeException
的情况下,您需要在编码时更加小心 - 所以请注意它可以在没有任何声明的情况下抛出 - 因此扩展 JsonProcessingException
是更可取的,IMO。