你可以试试Jackson views:
在这种情况下,“视图”意味着定义逻辑子集的能力
要序列化的属性(通过 getter 或字段访问的东西)。意见
是静态定义的(使用注释),但视图用于
序列化是动态选择的(每个序列化)。
编辑
我想我误解了你的问题。您可以使用视图,但这将非常棘手且难以理解。您可以使用MixIn feature,这将更容易实现。假设你有两个POJO 类:
class Pojo1 extends BaseAuditDto {
private String name;
//getters, setters
}
和
class Pojo2 extends BaseAuditDto {
private String description;
//getters, setters
}
现在我们必须使用来自BaseAuditDto 类的getter 创建接口。它可能看起来像这样:
interface BaseAuditDtoIgnorePropertiesMixIn {
@JsonIgnore
String getCreatedBy();
@JsonIgnore
Date getCreatedDate();
@JsonIgnore
String getUpdatedBy();
@JsonIgnore
Date getUpdatedDate();
}
如您所见,上面的接口为BaseAuditDto 类中存在的方法定义了注解。现在,我们必须告诉Jackson 我们要忽略哪些类的上述属性。见以下代码:
ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(Pojo1.class, BaseAuditDtoIgnorePropertiesMixIn.class);
现在,我们可以测试我们的类了:
Pojo1 pojo1 = new Pojo1();
pojo1.setCreatedBy("me");
pojo1.setCreatedDate(new Date());
pojo1.setUpdatedBy("you");
pojo1.setUpdatedDate(new Date());
pojo1.setId(1);
pojo1.setName("Name");
Pojo2 pojo2 = new Pojo2();
pojo2.setCreatedBy("me");
pojo2.setCreatedDate(new Date());
pojo2.setUpdatedBy("you");
pojo2.setUpdatedDate(new Date());
pojo2.setId(2);
pojo2.setDescription("Description");
System.out.println(mapper.writeValueAsString(pojo1));
System.out.println(mapper.writeValueAsString(pojo2));
上面的代码打印:
{"id":1,"name":"Name"}
{"id":2,"createdBy":"me","createdDate":1403653155395,"updatedBy":"you","updatedDate":1403653155395,"description":"Description"}
如您所见,Jackson 忽略了 Pojo1 类的 BaseAuditDto 属性。