Jackson自定义的反序列化运行时异常已用JsonMappingException封装



我有一个自定义的取消序列化程序,当id不是String类型时,需要CustomRuntimeException,但在我的测试结果中用JsonMappingException包装了异常。在我将jackson-databind模块从2.5.x升级到2.10.x之前,测试用例运行良好。但它失败了:

java.lang.Exception:意外异常,预期<CustomRuntimeException>,但是<com.fasterxml.jackson.databind.JsonMappingException>

在我升级jackson-databind之后。

@Override
public Optional<String> deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext) throws IOException {
if (jsonParser.getCurrentToken() != JsonToken.VALUE_STRING) {
throw new CustomRuntimeException("Id should be String");
}
return Optional.ofNullable(jsonParser.getValueAsString());
}

CustomRuntimeException:

public class CustomRuntimeException extends RuntimeException {
public CustomRuntimeException() {
super("Invalid argument is provided.");
}
public CustomRuntimeException(String message) {
super(message);
}
}

测试用例:

@Test(expected = CustomRuntimeException.class)
public void shouldThrowCustomRuntimeException() throws IOException {
objectMapper.readValue("{ "id": 1245672564 }", IdSchema.class);
}

堆栈跟踪:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: id should be String (through reference chain: com.xxx["id"])
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:397)
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:356)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1714)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:530)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:417)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1287)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4218)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3214)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3182)
at com.xxx.shouldThrowCustomRuntimeException(xxx.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:19)
... 16 more
Caused by: com.xxx.CustomRuntimeException: id should be String

您可以禁用功能反序列化功能.WRAP_EXCEPTION:

确定Jackson代码是否应捕获并包装异常(但从不包含错误!(的功能,以添加有关问题的位置(在输入内(。如果启用,则大多数例外将被捕获并重新抛出(特别是IOException可以按原样传递,因为它们被声明为可丢弃(;这很方便,因为所有异常都将检查和声明,因此有更多的上下文信息。然而,有时调用应用程序可能只是想要";生的";未检查异常按原样传递。默认情况下启用功能

示例:

ObjectMapper mapper = JsonMapper.builder()
.disable(DeserializationFeature.WRAP_EXCEPTIONS)
.build();

或者,您可以扩展com.fasterxml.jackson.databind.JsonMappingException而不是RuntimeException:

class CustomRuntimeException extends JsonMappingException {
public CustomRuntimeException(Closeable processor, String msg) {
super(processor, msg);
}
public CustomRuntimeException(Closeable processor) {
super(processor, "Invalid argument is provided.");
}
}

然后从反序列化程序中这样扔

if (p.getCurrentToken() != JsonToken.VALUE_STRING) {
throw new CustomRuntimeException(p, "Id should be String");
}

在这两种情况下,你都应该看到类似的东西:

Exception in thread "main" com.celoxity.CustomRuntimeException: Id should be String
at [Source: (File); line: 1, column: 9] (through reference chain: com.example.IdSchema["id"])
at com.example.IdJsonDeserializer.deserialize(JsonTypeInfoApp.java:36)
at com.example.IdJsonDeserializer.deserialize(JsonTypeInfoApp.java:31)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3070)

相关内容

  • 没有找到相关文章

最新更新