2017-04-24 3 views
-1

Ich habe einen Pojo, die wie folgt aussieht:Jackson Deserialisierung von benutzerdefinierten POJO

public class LdapUserImpl implements LdapUser 
{ 

    /** The Constant serialVersionUID. */ 
    private static final long serialVersionUID = 1L; 

    /** The action. */ 
    private String action; 

    private Map<String, String> translation; 

    /** The fields. */ 
    private List<Map<String, String>> fields; 

    public LdapUserImpl() 
    { 
    /* nothing special needed */ 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public String getAction() 
    { 
    return action; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public Map<String, String> getTranslation() 
    { 
    return translation; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public List<Map<String, String>> getFields() 
    { 
    return fields; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public void setAction(String action) 
    { 
    this.action = action; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public void setTranslation(Map<String, String> translation) 
    { 
    this.translation = translation; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public void setFields(List<Map<String, String>> data) 
    { 
    this.fields = data; 
    } 

} 

So ist es im Grunde enthält eine String, eine Map und eine Liste.

wenn ich versuche, dieses json zu lesen:

[ 
{ 
    'action': 'New User', 
    'translation': 
    { 
    'key': 'ldap.action.new', 
    'value': 'ldap.action.new' 
    }, 
    'fields': 
    [ 
    { 
    'emailAddress': 'email', 
    'changed': 'false' 
    }, 
    { 
    'enabled': 'TRUE', 
    'changed': 'false' 
    }, 
    { 
    'firstName': 'First', 
    'changed': 'false' 
    }, 
    { 
    'lastName': 'Last', 
    'changed': 'false' 
    }, 
    { 
    'name': 'FirstL', 
    'changed': 'false' 
    } 
    ] 
}, 
{ 
    'action': 'New User', 
    'translation': 
    { 
    'key': 'ldap.action.new', 
    'value': 'ldap.action.new' 
    }, 
    'fields': 
    [ 
    { 
    'emailAddress': 'email2', 
    'changed': 'false' 
    }, 
    { 
    'enabled': 'TRUE', 
    'changed': 'false' 
    }, 
    { 
    'firstName': 'First2', 
    'changed': 'false' 
    }, 
    { 
    'lastName': 'Last2', 
    'changed': 'false' 
    }, 
    { 
    'name': 'FirstL2', 
    'changed': 'false' 
    } 
    ] 
} 
] 

mit dieser Methode:

CollectionType typeReference = TypeFactory.defaultInstance().constructCollectionType(List.class, LdapUser.class); 
List<LdapUser> ldapUser = objectMapper.readValue((String) data.get(RESULT_DATA), typeReference); 

Wenn Sie sich fragen, warum ich werfen data.get-String ist es, weil ich Holen Sie sich die JSON als Map<String, Object> aber kann nur in String, da Casting auf etwas anderes verursacht eine Ausnahme die meiste Zeit.

Die Ausnahme, die ich das sieht aus wie erhalten:

"NachrichtTa": "com.fasterxml.jackson.databind.JsonMappingException", "message": „nicht Instanz von com.company.api konstruieren .data.authn.LdapUser, Problem: Abstrakte Typen müssen entweder zu konkreten Typen gemappt werden, einen benutzerdefinierten Deserializer haben oder mit zusätzlichen Typinformationen \ n unter [Quelle: {JSON} (über die Referenzkette: java.util.ArrayList) instanziiert werden [0]) ", " returnType ":" FATAL "

Das Objekt LdapUser i s Serialisierbar, so bekomme ich nicht das Problem, das Jackson mir gegenüber sagt.

+0

'LdapUser' ist eine Schnittstelle, nicht ein 'konkreter Typ', wie Fehlerzustände –

Antwort

1

Sie haben für die typeReference verwendet.

Sie müssen hier einen konkreten Typ wie LdapUserImpl.class verwenden, da Schnittstellen keine Felder oder Methodenimplementierungen haben, so dass sie Getter und Setter nicht lesen können.

+0

Ok, also ruft er nicht die Standardimplementierung von selbst ab? – Nico

+0

Es gibt keine "Standardimplementierung" für eine Schnittstelle. Du hast das selbst geschrieben ... –

Verwandte Themen