2012-10-16 15 views
10

Projekt musi często używać następującej kombinacji adnotacji Jacksona. Więc, czy jest jakiś sposób, aby utworzyć kolejną notatkę, aby uniknąć brzydkiego kopiowania/wklejania:Utwórz niestandardową adnotację Jacksona

public class A { 
    @JsonProperty("_id") 
    @JsonSerialize(using=IdSerializer.class) 
    @JsonDeserialize(using=IdDeserializer.class) 
    String id; 
} 

public class B { 
    @JsonProperty("_id") 
    @JsonSerialize(using=IdSerializer.class) 
    @JsonDeserialize(using=IdDeserializer.class) 
    String id; 
} 

public class C { 
    @CustomId // don't repeat that configuration endlessly 
    String id; 
} 

Aktualizacja: Próbowałem to bezskutecznie :-(

@Retention(RetentionPolicy.RUNTIME) 
@JacksonAnnotationsInside 
@JsonProperty("_id") 
@JsonSerialize(using=IdSerializer.class, include=JsonSerialize.Inclusion.NON_NULL) 
@JsonDeserialize(using=IdDeserializer.class) 
public @interface Id {} 

public class D { 
    @Id 
    private String id; 
} 

Odpowiedz

15

Zastosowanie @JacksonAnnotationsInside rozwiązania problemu:

public class JacksonTest { 

    @Retention(RetentionPolicy.RUNTIME) 
    @JacksonAnnotationsInside 
    @JsonProperty("_id") 
    @JsonSerialize(using=IdSerializer.class, include=Inclusion.NON_NULL) 
    @JsonDeserialize(using=IdDeserializer.class) 
    public @interface Id { 
    } 

    public static class Answer { 
     @Id 
     String id; 
     String name; 

     public Answer() {} 
    } 

    @Test 
    public void testInside() throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 
     VisibilityChecker<?> checker = mapper.getSerializationConfig().getDefaultVisibilityChecker(); 
     mapper.setVisibilityChecker(checker.withFieldVisibility(JsonAutoDetect.Visibility.ANY)); 

     String string = "{ 'name' : 'John' , '_id' : { 'sub' : '47cc'}}".replace('\'', '"'); 
     Answer answer = mapper.reader(Answer.class).readValue(string); 
     Assertions.assertThat(answer.id).isEqualTo("47cc"); 
    } 
} 
1

Przypuszczam, że można napisać własne klasy adnotacji

package org.codehaus.jackson.annotate ; 

public @ interface JsonProperty 
{ 
     String value () default "_id" ; 
} 

public @ interface JsonSerialize 
{ 
     Class using () default IdSerializer.class ; 
} 

... 

skompilować tych klas i upewnić się, że są w ścieżce klas przed oryginalnych wersjach. zmniejsza to jednak robi nie eliminuj kopiowania/wklejania.

Następnie próbka kodu staje

public class A { 
    @JsonProperty 
    @JsonSerialize 
    @JsonDeserialize 
    String id; 
} 

public class B { 
    @JsonProperty 
    @JsonSerialize 
    @JsonDeserialize 
    String id; 
} 

Zdaję sobie sprawę, że nie jest naprawdę to, co chciał, ale to dopiero początek.

+0

ja nie rozumiem, może Pan podać przykład, co to będzie wyglądać? Dzięki. –

+0

@yvesamsellem Edytowałem swoją odpowiedź z większym kodem – emory

+0

Ok. To pierwszy ciekawy krok. Masz pomysł na zebranie tylko Serializer & Deserializer? Wielkie dzięki. –

Powiązane problemy