我想使用相同的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,但在其他情况下,我不需要它。
谢谢。
发布于 2014-06-23 23:37:27
您可以尝试使用视图
此上下文中的“视图”意味着能够定义逻辑属性子集(通过getter或字段访问的内容)来序列化。视图是静态定义的(使用注释),但是要用于序列化的视图是动态选择的(每次序列化)。
编辑
我想我误解了你的问题。您可以使用视图,但这将是一个非常棘手和难以理解的。您可以使用MixIn特征,这将更容易实现。假设您有两个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属性。
发布于 2014-06-23 23:13:51
如果您打算序列化/反序列化对象(使用标准功能),则必须提供并期望所有值,则serialVersionUID定义序列化数据的格式。
当您将数据转换为JSON或XML时,情况就另当别论了--您可以提供/省略一些属性,因为格式足够冗长,以防止错误的分配。
https://stackoverflow.com/questions/24375555
复制相似问题