2012-10-16 100 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

好的。这似乎是第一个有趣的步骤。任何想法只收集串行器和解串器?非常感谢。 –