如何在对象不是根对象时才应用@JsonIgnore?

时间:2017-10-04 02:48:08

标签: java spring rest jackson

我正在使用Spring框架开发基于REST的JAVA项目。我的一些JPA实体从jackson获得了@JsonIgnore注释。示例如下。

@Entity
@Table(name="TRANSACTION")
public class Transaction {

    @Id
    @Column(name="SERIAL", length=16)
    private String serial;

    @Column(name="NARRATION", length=128)
    private String narration;

    @OneToMany(mappedBy="transaction", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    private List<TransactionDetail> details;

  // other fields goes here

}

@Entity
@Table(name="TRANSACTION_DETAIL")
public class TransactionDetail {

    @Id
    @Column(name="UUID", updatable=false)
    private String uuid;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name="FK_TRANSACTION")
    private Transaction transaction;

    @Column(name="ACCOUNT_NO")
    private int accountNo;

  // other fields goes here

}

根据上述类关系,我希望仅在我获取@JsonIgnore时才应用Transactions

List<Transactions> transactions = transactionsRepo.findAll()

但是如果我直接获取TransactionDetails,我也需要获取transaction中的属性TransactionDetail

List<TransactionDetail> details = transactionDetailsRepo.findByAccountNo(accountNo);

如何使用@JsonIgnore执行此操作?或者还有其他正确的方法来实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

@Entity
@JsonInclude(JsonInclude.Include.NON_NULL)
@Table(name="TRANSACTION_DETAIL")
public class TransactionDetail {

    @Id
    @Column(name="UUID", updatable=false)
    private String uuid;


    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="FK_TRANSACTION")
    private Transaction transaction;

    @Column(name="ACCOUNT_NO")
    private int accountNo;

  // other fields goes here

}

您可以尝试将fetchtype用作惰性,这样做会在事务详细信息实体中获取属性。但是它不会获取transaction_detail的相关数据,这意味着所有其他的数据都将为null。您可以使用@JsonInclude注释您的实体,因为我只包含非空值。 请添加jackson-datatype-hibernate Jar文件,或者如果你使用maven在pom文件中添加依赖项