3

我正在使用 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;
    }
}
4

3 回答 3

3

我建议您使用DTO。尤其是如果您的应用程序有机会增长(或已经很大),您将遇到多种类似或更复杂的情况:例如,您希望在一个上下文中仅显示实体的某些部分,而在另一个上下文中显示其他部分。DTO 实际上用于传输数据,而不是实体。

于 2014-04-14T12:53:47.110 回答
1

捏捏

您是否尝试使用 @JsonIgnore 。当此人只有一条记录时,您可以添加要显示的逻辑。您需要创建一个重复的变量。

像这样的东西

@JsonIgnore 公共地址 getAddress1() { return this.address; }

public void setAddress1(Address address1) {
    this.address = address1;
}
于 2014-04-08T17:18:57.490 回答
1

@XmlTransientJaxbAnnotationIntrospector您可能正在使用的识别:

@Override
public boolean hasIgnoreMarker(AnnotatedMember m) {
    return m.getAnnotation(XmlTransient.class) != null;
}

所以最简单的方法可能是对其进行子类化,并覆盖该方法。一般来说,您可以只返回“false”,或者,如果您只需要屏蔽一个特定实例,请尝试匹配方法或字段的名称,以确保您只屏蔽您想要的一个。

于 2014-04-12T21:28:11.137 回答