【问题标题】:Jackson jaxb runtime disable @XmlTransient annotation for specified fieldsJackson jaxb 运行时禁用指定字段的 @XmlTransient 注释
【发布时间】:2014-05-17 15:17:27
【问题描述】:

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

【问题讨论】:

    标签: jaxb jackson jax-ws xmltransient


    【解决方案1】:

    捏紧

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

    类似的东西

    @JsonIgnore 公共地址 getAddress1() { 返回这个地址; }

    public void setAddress1(Address address1) {
        this.address = address1;
    }
    

    【讨论】:

    • 感谢您的回答,但这不是我想做的。当我返回人员对象列表时,我想忽略地址和密码字段,而在返回单个人员对象时,我不想忽略任何字段。有重复的变量不能解决我的问题,这也是一个糟糕的设计。
    【解决方案2】:

    @XmlTransient 被您可能正在使用的JaxbAnnotationIntrospector 识别:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-12-14
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2012-02-25
        • 2014-01-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        相关资源
        最近更新 更多