2015-11-19 72 views
0

如果我宣布一个注解类,像这样:我可以公开注释属性吗?

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface ReportType { 

    public String reportName(); 
} 

然后我建了一堆谁使用此批注,并提供一个“所以reportName”但显然财产所以reportName不露出像一个普通类的列表吸气。我可以在Java中访问它,但如果我使用spring返回List,那么JSON字符串中没有属性会从它转换而来。我希望看到:

{"reportName":"TPS Report"} 

,而不是我看到:

{} 

是否有额外的东西,我可以做的就是财产所以reportName包括在JSON得到什么?

+0

你可以用一个简单的代码示例来解释你试图序列化的东西是什么?贴着@ @ JsonProperty'适用于大多数事情,也许对你来说也适用? – zapl

+0

这就是我想要序列化的东西 - 使用该自定义@ReportType属性的类的实例。目标是让reportName以JSON序列化。我想我将不得不围绕它编写一个包装类来暴露获取者以使其工作。 – Trant

+0

是的,一种方法是让代码如https://github.com/netty/netty/blob/master/transport/src/main/java/io/netty/channel/ChannelHandlerAdapter.java#L36在父类所有将该值作为常规属性公开的序列化类。无需制定者。另一种替代方案是用于'Object'的客户序列化程序,但我想这会变得很困难。最后,由于你是在春天,我可以想象你可以创建动态代理(子)类,定期公开属性,而不必继承它。 – zapl

回答

2

实现此目的的一种方法是将字段reportName保留在POJO中。在传递JSON序列化实例之前,使用类上的注释值填充该字段。

@ReportType(reportName = "html") 
public class HTMLReport { 

    //Can be potentially moved to parent class of all reports. 
    @JsonProperty("reportName") 
    private String reportName; 

    public String getReportName() { 
     return reportName; 
    } 

    public void setReportName(String reportName) { 
     this.reportName = reportName; 
    } 

} 

public class ReportName { 

    public static void main(String[] args) throws Exception, JsonMappingException, IOException { 
     HTMLReport r = new HTMLReport(); 

     ReportType type = r.getClass().getAnnotation(ReportType.class); 
     String reportName = type.reportName(); 
     r.setReportName(reportName); 

     ObjectMapper m = new ObjectMapper(); 
     m.writeValue(System.out, r); //Produces {"reportName":"html"} 
    } 

}