Java 如何使用@JsonIgnore仅在对象不是根对象时应用?
我正在使用Spring框架进行一个基于REST的JAVA项目。我的一些JPA实体的属性有来自jackson的@JsonIgnore注释。下面的例子Java 如何使用@JsonIgnore仅在对象不是根对象时应用?,java,spring,rest,jackson,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=12
@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
}
但是,如果我直接获取TransactionDetails,我还需要获取TransactionDetail中的属性事务
List<TransactionDetail> details = transactionDetailsRepo.findByAccountNo(accountNo);
我如何使用@JsonIgnore来实现这一点?或者有没有其他合适的方法来实现这一点
@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用作lazy,这样做的目的是在事务细节实体中获取属性。但它不会获取事务_detail的相关数据,这意味着所有其他数据都将为空。您可以像我一样使用@JsonInclude注释您的实体,以便只包含非空值。
请添加jackson数据类型hibernate Jar文件,或者如果您正在使用maven,请在pom文件中添加依赖项让我知道这是否是您的要求?我之所以放置@JsonIgnore,是因为它在加载事务并转换为JSON时创建了一个循环。但是,当我加载TransactionDetails时,我需要这个字段以JSON的形式出现。我希望你的答复能有所帮助。我将对其进行测试并进行更新。@Madu,在进行上述更改后,我遇到以下错误:无法编写JSON文档:无法初始化代理-没有会话,就像jackson想要遍历所有字段,会话已经关闭。太好了!。幸运的是,我能够找到执行此任务所需的丢失的罐子。jackson数据类型hibernate必须在我的库中才能工作。我补充说,现在很好。请编辑您的答案以包含该库并删除@JsonIgnore,然后在此处添加@JsonIncludewhat。我会选择你的答案。谢谢@Madhu。当获取具有复杂关系的对象时,这篇博客文章会有所帮助。
@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
}