2014-12-10 18 views
8

Wymagania:budowniczy z Jackson do deserializacji

  1. chcieliby skorzystać budowniczy
  2. Jacksona dla deserializacji
  3. nie chce używać ustawiające

Jestem pewien, że jackson działa na podstawie modułów pobierających i ustawiających w POJO. Ponieważ mam wzorzec konstrukcji, nie ma sensu mieć ponownie ustawiaczy. W takim przypadku Jak wskazać jackson do deserializacji za pomocą wzorca Buildera?

Każda pomoc zostanie doceniona. Próbowałem @JsonDeserialize (builder = MyBuilder.class) i nie działa.

Jest to wymagane w koszulce REST. Obecnie używam modułu jersey-media-jackson maven do gry w jacksona i unmarshallingu.

Odpowiedz

13

@JsonDeserialize to droga, pod warunkiem, że masz jackson-databind na swojej ścieżce klas. Poniższe fragmenty są kopiowane z 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); 
    } 
} 

alternatywnie użyć @JsonPOJOBuilder jeśli nie podoba nazwy metod, które mają with prefix:

@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

znalazłem problem. @JsonPOJOBuilder zawsze zakłada, że ​​setery zaczną od "z", w celu przezwyciężenia tego użyłem pustego prefiksu. (withPrefix = ""), który rozwiązał mój problem. Dzięki za wskazówki. –

+0

Nie czytałem uważnie i napotkałem mnóstwo problemów spowodowanych brakiem zależności 'jackson-databind' w moim projekcie. Strzec się. – Vlasec

+0

Przeczytałem drugi blok ("alternatywa, tylko' @ JsonPOJOBuilder'), co oznacza, że ​​mógłbym to zrobić ** zamiast **, zamiast ** oprócz ** adnotacji '@ JsonDeserialize'. Przynajmniej dla mnie potrzebowałem obu adnotacji. –