2014-12-10 11 views
8

Anforderungen:Builder-Muster mit Jackson für Deserialisieren

  1. Möchte Builder
  2. Jackson Muster für die Deserialisierung
  3. Möchten Setter verwenden nicht verwenden

Ich bin sicher, dass Jackson auf GETTER und Setter auf dem POJO basiert. Da ich ein Buildder-Muster habe, hat es keinen Sinn mehr, Setter zu haben. In diesem Fall, Wie können wir Jackson mit Hilfe des Builder-Musters deserialisieren?

Jede Hilfe wäre willkommen. Ich habe versucht @ JsonDeserialize (builder = MyBuilder.class) und funktioniert nicht.

Dies ist in REST Trikot erforderlich. Ich bin derzeit Jersey-Media-Jackson-Maven-Modul für Jacksons Marshalling und Unmarshalling.

Antwort

13

@JsonDeserialize ist der Weg zu gehen, vorausgesetzt, Sie haben jackson-databind auf Ihrem Klassenpfad. Die folgenden Schnipsel aus den Jackson Documentation kopiert:

@JsonDeserialize(builder=ValueBuilder.class) 
public class Value { 
    private final int x, y; 
    protected Value(int x, int y) { 
    this.x = x; 
    this.y = y; 
    } 
} 

public class ValueBuilder { 
    private int x, y; 

    // can use @JsonCreator to use non-default ctor, inject values etc 
    public ValueBuilder() { } 

    // if name is "withXxx", works as is: otherwise use @JsonProperty("x") or @JsonSetter("x")! 
    public ValueBuilder withX(int x) { 
    this.x = x; 
    return this; // or, construct new instance, return that 
    } 
    public ValueBuilder withY(int y) { 
    this.y = y; 
    return this; 
    } 

    public Value build() { 
    return new Value(x, y); 
    } 
} 

alternativ, verwenden Sie die @JsonPOJOBuilder, wenn Sie keine Methodennamen wie, die den with Präfix:

@JsonPOJOBuilder(buildMethodName="create", withPrefix="con") 
public class ValueBuilder { 
    private int x, y; 

    public ValueBuilder conX(int x) { 
    this.x = x; 
    return this; // or, construct new instance, return that 
    } 
    public ValueBuilder conY(int y) { 
    this.y = y; 
    return this; 
    } 

    public Value create() { return new Value(x, y); } 
} 
+5

ich das Problem gefunden. Der @JsonPOJOBuilder wird immer davon ausgehen, dass die Setter mit "mit" beginnen. Um dies zu überwinden, habe ich ein leeres Präfix verwendet. (withPrefix = "") was mein Problem gelöst hat. Danke für deine Hinweise. –

+0

Ich habe nicht sorgfältig gelesen und stieß auf eine Menge Probleme, die dadurch verursacht wurden, dass ich in meinem Projekt nicht die Abhängigkeit 'jackson-datenbind' hatte. In acht nehmen. – Vlasec

+0

Ich lese den zweiten Block ("Alternative, nur die' @ JsonPOJOBuilder' ") als bedeutet, dass ich ** anstelle von ** zusätzlich zu ** der' @ JsonDeserialize' Annotation tun könnte. Zumindest für mich brauchte ich beide Anmerkungen. –

Verwandte Themen