Ich habe eine Entitätsklasse mit einem Passwortfeld:
class User {
private String password;
//setter, getter..
}
Ich möchte, dass dieses Feld während der Serialisierung übersprungen wird. Aber es sollte immer noch in der Lage sein, zu deserialisieren. Dies ist erforderlich, damit der Client mir ein neues Passwort senden kann, aber das aktuelle nicht lesen kann.
Wie schaffe ich das mit Jackson?
@JsonIgnore
Getter, aber@JsonProperty
Setter hinzuzufügen. In diesem Fall werden die Dinge nicht serialisiert, sondern können deserialisiert werden.Antworten:
Sie können es als markieren
@JsonIgnore
.Mit 1.9 können Sie
@JsonIgnore
für Getter,@JsonProperty
für Setter hinzufügen , damit es deserialisiert, aber nicht serialisiert wird.quelle
@JsonIgnore
für Getter,@JsonProperty
für Setter hinzufügen , damit es deserialisiert, aber nicht serialisiert wird.transient
(wie inprivate transient String password;
), aber vorübergehende Felder mit öffentlichen Gettern werden ignoriert, sofern MapperFeature.PROPAGATE_TRANSIENT_MARKER nicht aktiviert ist.Dies funktioniert für mich, um zu veranschaulichen, was StaxMan gesagt hat
quelle
@JsonIgnore
ist auf dem Feld nicht notwendig, wie es scheint.Der einfache Weg ist, Ihre Getter und Setter mit Anmerkungen zu versehen.
Hier ist das ursprüngliche Beispiel, das geändert wurde, um das Nur-Text-Kennwort auszuschließen, aber dann eine neue Methode mit Anmerkungen zu versehen, die nur das Kennwortfeld als verschlüsselten Text zurückgibt.
quelle
Ab Jackson 2.6 kann eine Eigenschaft als schreibgeschützt oder schreibgeschützt markiert werden. Es ist einfacher als das Hacken der Anmerkungen auf beiden Accessoren und bewahrt alle Informationen an einem Ort auf:
quelle
Abgesehen davon
@JsonIgnore
gibt es noch einige andere Möglichkeiten:@JsonIgnoreProperties
auf Klasse kann nützlich seinquelle
transient
ist die Lösung für mich. Vielen Dank! Es ist in Java integriert und verhindert, dass Sie eine weitere Framework-spezifische Anmerkung hinzufügen.quelle
Man sollte sich fragen, warum Sie eine öffentliche Getter-Methode für das Passwort wünschen. Der Ruhezustand oder ein anderes ORM-Framework funktioniert mit einer privaten Getter-Methode. Um zu überprüfen, ob das Passwort korrekt ist, können Sie verwenden
quelle
Jackson hat eine Klasse namens SimpleBeanPropertyFilter, mit deren Hilfe Felder während der Serialisierung und Deserialisierung gefiltert werden können. nicht global. Ich denke, das wolltest du.
Dann in Ihrem Code:
Dadurch wird verhindert, dass das
password
Feld serialisiert wird. Außerdem können Siepassword
Felder so wie sie sind deserialisieren . Stellen Sie einfach sicher, dass keine Filter auf das ObjectMapper-Objekt angewendet werden.quelle
Variable setzen als
@JsonIgnore
Dadurch kann die Variable vom json serializer übersprungen werden
quelle