Jackson ObjectMapper - Spezifiziert die Serialisierungsreihenfolge der Objekteigenschaften
Ich bin Implementierung eines RESTful web-service, wo der Benutzer hat senden einer signierten Verifizierungs-token zusammen mit der Anfrage, so dass ich sicherstellen kann, dass der Antrag nicht manipuliert wurde durch eine Mitte der Mensch. Meine aktuelle Umsetzung ist wie folgt.
Überprüfung token ist ein VerifData Objekt serialisiert in einen String und dann gehasht und verschlüsselt.
class VerifData {
int prop1;
int prop2;
}
In meinem Dienst, ich lege die Daten serialisiert in eine Instanz von VerifData und dann Serialisierung mit Jackson-ObjectMapper entlang und passierten die Verifizierung Motor zusammen mit dem überprüfungscode.
VerfiData verifData = new VerifData(12345, 67890);
ObjectMapper mapper = new ObjectMapper();
String verifCodeGenerated = mapper.writeValueAsString(verifData);
Aber es scheint, dass jedes mal, wenn der application-container gestartet wird, wird die Reihenfolge der Eigenschaften zugeordnet wird, in eine Zeichenfolge von ObjectMapper änderungen.
Ex: ein mal wäre es
{"prop1":12345,"prop2":67890}
und ein anderes mal wäre es
{"prop2":67890,"prop1":12345}
So hat der AUFTRAGGEBER serialisiert die VerifData Instanz wie in der ersten Zeichenfolge, es ist 50% chance, dass es fehlgeschlagen ist, obwohl es korrekt ist.
Gibt es eine Möglichkeit dies zu umgehen? Kann ich die Reihenfolge festlegen von Eigenschaften zuordnen, die von ObjectMapper (wie in aufsteigender Reihenfolge)? Oder gibt es eine andere Möglichkeit zur optimalen Durchführung dieser überprüfung Schritt. Client-und server-Implementierungen sind von mir entwickelt wurde. Ich benutze Java-Security-API für das signieren und überprüfen.
InformationsquelleAutor der Frage Lihini | 2014-12-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der Jackson Anmerkungen Dokumentation:
InformationsquelleAutor der Antwort wgitscht
Die Anmerkungen sind hilfreich, aber kann ein Schmerz, um überall gelten. Sie können Ihren ganzen ObjectMapper auf diese Weise zu arbeiten mit
Aktuellen Jackson-Versionen:
objectMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true)
Älteren Jackson-Versionen:
objectMapper.configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY, true);
InformationsquelleAutor der Antwort Duncan McGregor
Im Frühjahr Starten, kann man dieses Verhalten Global, indem Sie die folgenden Ihre
Application
entry-point-Klasse:InformationsquelleAutor der Antwort Gary Rowe
Gibt es eine einfachere Art und Weise, in Spring Boot durch die Angabe einer Eigenschaft (in
application.properties
zum Beispiel:InformationsquelleAutor der Antwort Wim Deblauwe
Von Duncan McGregor ' s Antwort:
Es ist besser, es so zu benutzen:
als MapperFeature ist für XML-Dateien und kommt mit jackson-databind-Methode ist nicht erforderlich...
InformationsquelleAutor der Antwort Nemes Nisano
In Jackson 2.x, die Sie wahrscheinlich mit der heutigen Nutzung:
Wenn Sie sich sorgen über das Aussehen, Sie können auch überlegen, ob
SerializationFeature.INDENT_OUTPUT
als gut.Beachten Sie, dass Sie serialisieren müssen Karten oder Objekte für diese richtig sortiert. Wenn Sie serialisieren eines
JsonNode
zum Beispiel (ausreadTree
), das wird nicht ordnungsgemäß eingezogen.Beispiel
Ergebnisse in:
InformationsquelleAutor der Antwort user2089674