我想使用相同的DTO,但在某些情况下我需要忽略一些属性,在其他情况下我想使用它,但我不想做一个重复的对象或自定义序列化,以某种方式存在要指定,如果在此实现中使用DTO,则忽略此属性,如果在其他实现中使用DTO,则不要忽略这些属性。
我使用 jackson 来序列化DTO
public abstract class BaseAuditDto extends BaseIdentifiableDto {
private static final long serialVersionUID = -6010447982202996167L;
@JsonIgnore
private String createdBy;
@JsonIgnore
private Date createdDate;
@JsonIgnore
private String updatedBy;
@JsonIgnore
private Date updatedDate;
//getters and setters
}
基本上我需要在某些情况下使用createdBy和createdDate,但在其他情况下我不需要它。
感谢。
答案 0 :(得分:1)
您可以尝试使用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
忽略BaseAuditDto
类的Pojo1
属性。
答案 1 :(得分:-1)
AFAIK如果您打算序列化/反序列化您必须提供的对象(使用标准功能),然后期望所有值,则serialVersionUID定义序列化数据的格式。
当您将数据转换为JSON或XML时,这是另一个故事 - 您可以提供/省略一些属性,因为格式足够冗长以防止错误的分配。