Jackson jaxb runtime禁用指定字段的@XmlTransient注释

时间:2014-04-05 06:41:44

标签: jaxb jackson jax-ws xmltransient

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

3 个答案:

答案 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',或者,如果您只需要屏蔽一个特定实例,请尝试匹配方法或字段的名称,以确保您只阻止一个(。)