我正在接受一些遗留代码,并尝试编写一个lambda来处理函数。
函数看起来像
public Task doTask(Message message) throws Exception {
LOG.debug("debug message");
// ... more code
}
但是,参数Message
在不同的模块中定义(使用 getter 和 setter)(并作为依赖项传入)。结果我收到错误:
{
"errorMessage": "An error occurred during JSON parsing",
"errorType": "java.lang.RuntimeException",
"stackTrace": [],
"cause": {
"errorMessage": "com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.mywebsite.messaging.Message, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type informationn at [Source: lambdainternal.util.NativeMemoryAsInputStream@31610302; line: 1, column: 1]",
"errorType": "java.io.UncheckedIOException",
"stackTrace": [],
"cause": {
"errorMessage": "Can not construct instance of com.mywebsite.messaging.Message, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type informationn at [Source: lambdainternal.util.NativeMemoryAsInputStream@31610302; line: 1, column: 1]",
"errorType": "com.fasterxml.jackson.databind.JsonMappingException",
"stackTrace": [
"com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)",
"com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:892)",
"com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:139)",
"com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1511)",
"com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1102)"
]
}
}
}
如何序列化这个甚至不在我的模块中的对象?
任何和所有的帮助将不胜感激。
谢谢!
看起来像 com.mywebsite.messaging.Message 要么是一个抽象类/接口。在这种情况下:使用@JsonDeserialize将解决问题。
像这样:
@JsonDeserialize(using = MessageDeserializer.class)
interface Message {
}
@JsonDeserialize(as = MessageImpl.class)
public class MessageImpl implements Message{
//write your implementation
}
public class MessageDeserializer extends JsonDeserializer<Message> {
@Override
public Message deserialize(JsonParser jp, DeserializationContext context) throws IOException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = mapper.readTree(jp);
return mapper.readValue(root.toString(), MessageImpl.class);
}
}
这些链接可以帮助您:如何使用杰克逊将自定义反序列化程序添加到接口http://www.baeldung.com/jackson-exception
希望这有帮助!