2017-10-09 3 views
0

Je prends sur un code existant et essaie d'écrire un lambda pour travailler sur une fonction.AWS Lambda Sérialisation objet dans un autre module

La fonction ressemble

public Task doTask(Message message) throws Exception { 
    LOG.debug("debug message"); 
    // ... more code 
} 

Cependant, le paramètre est défini Message (avec accesseurs) dans un autre module (et transmis sous forme de dépendance). En conséquence, je reçois l'erreur:

{ 
    "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 information\n at [Source: [email protected]; 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 information\n at [Source: [email protected]; 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)" 
     ] 
    } 
    } 
} 

Comment est-il possible de sérialisation cet objet qui est même pas dans mon module?

Toute aide serait grandement appréciée.

Merci!

Répondre

0

On dirait que com.mywebsite.messaging.Message est soit une classe abstraite/ Interface. Dans ce cas, l'utilisation de @JsonDeserialize résoudra le problème.

Quelque chose comme ceci:

@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); 
    } 
} 

Ces liens peuvent vous aider: How to add custom deserializer to interface using jackson http://www.baeldung.com/jackson-exception

Hope this helps!