2014-12-10 35 views
8

Requisiti:builder con Jackson per la deserializzazione

  1. desidera utilizzare builder
  2. Jackson per la deserializzazione
  3. non desidera utilizzare setter

Sono sicuro che il jackson funziona basandosi su getter e setter sul POJO. Dal momento che, ho un modello di builder, non c'è motivo di avere di nuovo setter. In questo caso, come possiamo indicare a Jackson di deserializzare con l'aiuto del pattern Builder?

Qualsiasi aiuto sarebbe apprezzato. Ho provato @JsonDeserialize (builder = MyBuilder.class) e non funziona.

Richiesto in maglia REST. Sono attualmente modulo di jersey-media-jackson maven per il jackson marshalling e unmarshaling.

risposta

13

@JsonDeserialize è la strada da percorrere, purché sul percorso di classe sia presente jackson-databind. I seguenti frammenti vengono copiati dal Jackson Documentation:

@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); 
    } 
} 

alternativa, utilizzare il @JsonPOJOBuilder se non ti piace i nomi dei metodi che hanno il with prefisso:

@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

ho trovato il problema. @JsonPOJOBuilder supporrà sempre che i setter inizieranno con "con", per ovviare a questo ho usato il prefisso vuoto. (withPrefix = "") che ha risolto il mio problema. Grazie per i tuoi suggerimenti. –

+0

Non stavo leggendo attentamente e ho riscontrato un sacco di problemi causati dal non avere la dipendenza 'jackson-databind' nel mio progetto. Attenzione. – Vlasec

+0

Ho letto il secondo blocco ("alternativa, solo il' @ JsonPOJOBuilder' ") nel senso che potrei farlo ** invece ** di, piuttosto che ** oltre a ** l'annotazione' @ JsonDeserialize'. Almeno per me, avevo bisogno di entrambe le annotazioni. –

Problemi correlati