Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用@JsonIgnore仅在对象不是根对象时应用?_Java_Spring_Rest_Jackson - Fatal编程技术网

Java 如何使用@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

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

}
但是,如果我直接获取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

}