2012-10-16 35 views
10

一個項目需要將以下Jackson註釋組合在一起使用。那麼,有沒有一種方法來創建另一個註解,以避免難看的複製/粘貼:創建一個自定義的Jackson註釋

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

更新:我想這一點,但沒有成功:-(

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

回答

15

採用@JacksonAnnotationsInside解決的問題:

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

我猜想你可以編寫自己的註解類

package org.codehaus.jackson.annotate ; 

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

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

... 

編譯這些類,並確保它們在原始版本之前在你的類路徑中。不會消除複製/粘貼。

然後您的代碼示例變得

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

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

我知道這是不是真的,你想要的東西,但它是一個開始。

+0

我不明白這一點,你可以請提供它會是什麼樣子的例子嗎?謝謝。 –

+0

@yvesamsellem我用更多的代碼編輯了我的答案 – emory

+0

好的。這似乎是第一個有趣的步驟。任何想法只收集串行器和解串器?非常感謝。 –