直接自引用导致循环异常

Glo*_*ior 13 java serialization jackson deserialization elasticsearch

我有类似这样的课

public abstract class ElasticSearchValue<T> {

  private Long txId;
  private Long currentTxId;
  private T previous;

  public Long getTxId() {
    return txId;
  }

  public void setTxId(Long txId) {
    this.txId = txId;
  }

  public Long getCurrentTxId() {
    return currentTxId;
  }

  public void setCurrentTxId(Long currentTxId) {
    this.currentTxId = currentTxId;
  }

  public Object getPrevious() {
    return previous;
  }

  public void setPrevious(T previous) {
    this.previous = previous;
  }

}
Run Code Online (Sandbox Code Playgroud)

还有一个扩展上面课程的课程

public class DailyActivity extends ElasticSearchValue<DailyActivity> {

  Long agentId;
  Date date;
  Long success;

  public Long getAgentId() {
    return agentId;
  }

  public void setAgentId(Long agentId) {
    this.agentId = agentId;
  }

  public Date getDate() {
    return date;
  }

  public void setDate(Date date) {
    this.date = date;
  }

  public Long getSuccess() {
    return success;
  }

  public void setSuccess(Long success) {
    this.success = success;
  }

  @Override
  public String toString() {
    return agentId + "_" + date.toString();
  }

}
Run Code Online (Sandbox Code Playgroud)

现在,我有一个DailyActivity类型的对象,当我尝试将其转换为json字符串时,我得到以下异常:

public abstract class ElasticSearchValue<T> {

  private Long txId;
  private Long currentTxId;
  private T previous;

  public Long getTxId() {
    return txId;
  }

  public void setTxId(Long txId) {
    this.txId = txId;
  }

  public Long getCurrentTxId() {
    return currentTxId;
  }

  public void setCurrentTxId(Long currentTxId) {
    this.currentTxId = currentTxId;
  }

  public Object getPrevious() {
    return previous;
  }

  public void setPrevious(T previous) {
    this.previous = previous;
  }

}
Run Code Online (Sandbox Code Playgroud)

我在google上寻找解决方案,但我得到的解决方案要求将jsonIgnore放到以前的值,这不是我打算做的.有没有人遇到同样的问题?谢谢

编辑 我知道课堂上有一个循环,我问如何反序列化具有自引用的类?

bor*_*jab 13

在这种情况下,您需要注释与@JsonManagedReference@JsonBackReference的关系,如下所示:

 @ManyToOne
 @JoinColumn(name = "company_id", referencedColumnName = "id")
 @JsonBackReference
 private Company company 
Run Code Online (Sandbox Code Playgroud)

 @OneToMany(mappedBy="company")
 @JsonManagedReference
 private Set<Employee> employee = new HashSet<Employee>();
Run Code Online (Sandbox Code Playgroud)

有一个很好的例子在这里


Val*_*oMC 9

SerializationFeature有一个名为FAIL_ON_SELF_REFERENCESdefault is的属性,true但您可以设置false为跳过这种异常。

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.FAIL_ON_SELF_REFERENCES, false);
Run Code Online (Sandbox Code Playgroud)

如果你正在使用SpringBoot你可以简单地添加spring.jackson.serialization.fail-on-self-references=false 在你的application.properties

  • 警告:使用此解决方案代码可能会进入无限递归。例如无法编写 JSON:无限递归(StackOverflowError) (8认同)

eri*_*cbn 7

自我参考在这里:

public class DailyActivity extends ElasticSearchValue<DailyActivity> {
Run Code Online (Sandbox Code Playgroud)

你说的DailyActivity是 an ElasticSearchValue<DailyActivity>,它本身就是一个ElasticSearchValue<ElasticSearchValue<DailyActivity>>,而且这种情况是无限持续的......

更新:我会把它分成两节课。创建DailyActivity没有子类化ElasticSearchValue

public class DailyActivity {
  // the same content as your class above
Run Code Online (Sandbox Code Playgroud)

然后创建另一个类,如:

public class ElacticDailyActivity extends ElasticSearchValue<DailyActivity> {
Run Code Online (Sandbox Code Playgroud)


小智 -8

我猜你的代码中的某个地方。DailyActivity 某些实例的前一个指向其自身。