2012-10-16 17 views
10

Ein Projekt muss die folgende Kombination von Jackson Annotationen zusammen eine Menge verwenden. So ist es eine Möglichkeit, eine andere Anmerkung zu erstellen hässliches Kopieren/Einfügen zu vermeiden:Erstellen Sie eine benutzerdefinierte Jackson Annotation

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

Update: Ich habe dies versucht, ohne Erfolg :-(

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

Antwort

15

Die Verwendung von @JacksonAnnotationsInside das Problem lösen:

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

Ich würde vermuten, dass Sie können Ihre eigene Annotation-Klassen

package org.codehaus.jackson.annotate ; 

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

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

... 

Kompilieren diese Klassen schreiben und stellen Sie sicher, dass vor den Originalversionen in Ihrem classpath sind. Dies reduziert aber tut nicht das Kopieren/Einfügen beseitigen.

Dann wird Ihr Codebeispiel wird

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

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

Ich weiß, es ist nicht wirklich das, was Sie wollen, aber es ist ein Anfang.

+0

ich es nicht erhalten, können Sie bitte ein Beispiel für das, was es aussehen würde? Vielen Dank. –

+0

@yvesamsellem Ich habe meine Antwort mit mehr Code bearbeitet – emory

+0

Ok. Es scheint ein erster interessanter Schritt zu sein. Irgendeine Idee, nur Serializer & Deserializer zu sammeln? Danke vielmals. –

Verwandte Themen