我正在使用Jackson(jaxb)进行JSON编组和解组。
例如,这里我有一个带注释的地址字段XmlTransient,因为我不希望在列出人员记录时映射(安全和速度问题),地址字段仍然是懒惰的。但是当返回单个人记录时,我希望映射地址字段,但即使急切地获取地址jaxb仍然没有映射它。有没有什么办法可以改变这种行为,并在地址字段用@XmlTransient注释时在运行时映射这个字段?
public class Person implements Serializable {
@Column(nullable = false, length = 50)
private String username;
@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
private Address address;
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
@XmlTransient
public Address getAddress() {
return this.address;
}
public void setAddress(Address address) {
this.address = address;
}
}
答案 0 :(得分:3)
我建议您使用DTOs。特别是如果你的应用程序有可能增长(或者已经很大),你会有多种情况,比如这样或更复杂:例如,你只想在上下文中显示实体的某些部分,而在另一个上下文中显示其他部分。 DTO实际上用于传输数据,而不是实体。
答案 1 :(得分:1)
钳子
您是否尝试使用@JsonIgnore。您可以添加逻辑,以便在此人只有一条记录时显示。您需要创建一个重复变量。
类似这样的事情
@JsonIgnore 公共地址getAddress1(){ 归还。地址; }
public void setAddress1(Address address1) {
this.address = address1;
}
答案 2 :(得分:1)
@XmlTransient
被您可能正在使用的JaxbAnnotationIntrospector
识别:
@Override
public boolean hasIgnoreMarker(AnnotatedMember m) {
return m.getAnnotation(XmlTransient.class) != null;
}
所以最简单的方法可能是对它进行子类化,并覆盖该方法。您可以一般只返回'false',或者,如果您只需要屏蔽一个特定实例,请尝试匹配方法或字段的名称,以确保您只阻止一个(。)