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.
'LdapUser' ist eine Schnittstelle, nicht ein 'konkreter Typ', wie Fehlerzustände –