compile "com.fasterxml.jackson.core:jackson-databind:2.8.2"
compile "com.fasterxml.jackson.dataformat:jackson-dataformat-smile:2.8.2"
compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.2"
package com.volumeintegration.va.messaging;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.deser.std.StackTraceElementDeserializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.junit.Ignore;
import org.junit.Test;
import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
public class StackTraceElementTest {
@Ignore
@Test
public void test() throws Exception {
// JMV 1
ErrorObject error = new ErrorObject(new Exception("exception message"));
ObjectMapper objectMapper1 = new ObjectMapper();
objectMapper1.findAndRegisterModules();
objectMapper1.registerModule(new JavaTimeModule());
objectMapper1.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper1.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
byte[] bytes = objectMapper1.writeValueAsBytes(error);
// JVM 2
ObjectMapper objectMapper2 = new ObjectMapper();
objectMapper2.findAndRegisterModules();
objectMapper2.registerModule(new JavaTimeModule());
objectMapper2.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper2.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
JsonNode jsonNode = objectMapper2.readValue(bytes, JsonNode.class);
System.out.println(jsonNode);
/*
{
"throwable":"java.lang.Exception",
"message":"exception message",
"stackTrace":[
{
"declaringClass":"com.volumeintegration.va.messaging.StackTraceElementTest",
"methodName":"test",
"fileName":"StackTraceElementTest.java",
"lineNumber":23,
"className":"com.volumeintegration.va.messaging.StackTraceElementTest",
"nativeMethod":false
},
{
"declaringClass":"sun.reflect.NativeMethodAccessorImpl",
"methodName":"invoke0",
"fileName":"NativeMethodAccessorImpl.java",
"lineNumber":-2,
"className":"sun.reflect.NativeMethodAccessorImpl",
"nativeMethod":true
},
...
*/
ObjectMapper objectMapper3 = new ObjectMapper();
objectMapper3.findAndRegisterModules();
objectMapper3.registerModule(new JavaTimeModule());
objectMapper3.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
ErrorObject deserialized = objectMapper3.treeToValue(jsonNode, ErrorObject.class);
System.out.println(deserialized);
/*
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "declaringClass" (class java.lang.StackTraceElement), not marked as ignorable
at [Source: N/A; line: -1, column: -1] (through reference chain: com.volumeintegration.va.messaging.ErrorObject["stackTrace"]->Object[][0]->java.lang.StackTraceElement["declaringClass"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:62)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:833)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1096)
at com.fasterxml.jackson.databind.deser.std.StackTraceElementDeserializer.deserialize(StackTraceElementDeserializer.java:52)
at com.fasterxml.jackson.databind.deser.std.StackTraceElementDeserializer.deserialize(StackTraceElementDeserializer.java:11)
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:196)
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:20)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:490)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140)
at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3761)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2090)
at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:2587)
at com.volumeintegration.va.messaging.StackTraceElementTest.test(StackTraceElementTest.java:45)
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:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
*/
}
@JsonInclude(NON_NULL)
public static class ErrorObject {
private String throwable;
private String message;
@JsonDeserialize(contentUsing = StackTraceElementDeserializer.class) private StackTraceElement[] stackTrace;
public ErrorObject() {}
public ErrorObject(Throwable throwable) {
this.throwable = throwable.getClass().getName();
message = throwable.getMessage();
stackTrace = throwable.getStackTrace();
}
public String getThrowable() {
return throwable;
}
public void setThrowable(String throwable) {
this.throwable = throwable;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public StackTraceElement[] getStackTrace() {
return stackTrace;
}
public void setStackTrace(StackTraceElement[] stackTrace) {
this.stackTrace = stackTrace;
}
}
}