Прямая самооценка, приводящая к исключению цикла

У меня есть класс; что-то вроде следующего:

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;
  }

}

И класс, который расширяет класс выше

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();
  }

}

Теперь у меня есть объект типа DailyActivity, и когда я пытаюсь преобразовать его в строку JSON, я получаю следующее исключение:

Вызывается: com.fasterxml.jackson.databind.JsonMappingException: Прямая самостоятельная ссылка, ведущая к циклу (через цепочку ссылок: com.pr.analysis.DailyActivity [ "предыдущий"])

Я искал решение на Google, но решение, которое я получаю, просит поставить jsonIgnore на предыдущее значение, что я не собираюсь делать. Кто-нибудь сталкивался с такой же проблемой? Благодаря

EDIT Я знаю, что в классе есть цикл, и я спрашиваю, как десериализовать класс, который имеет собственную ссылку?

Ответы

Ответ 1

В этом случае вам нужно аннотировать отношения с помощью @JsonManagedReference и @JsonBackReference следующим образом:

 @ManyToOne
 @JoinColumn(name = "company_id", referencedColumnName = "id")
 @JsonBackReference
 private Company company 

А также

 @OneToMany(mappedBy="company")
 @JsonManagedReference
 private Set<Employee> employee = new HashSet<Employee>();

Существует хороший пример здесь

Ответ 2

Самостоятельная ссылка здесь:

public class DailyActivity extends ElasticSearchValue<DailyActivity> {

Вы говорите, что DailyActivity - это ElasticSearchValue<DailyActivity>, который сам по себе является ElasticSearchValue<ElasticSearchValue<DailyActivity>>, и это продолжается бесконечно...

Обновление: я бы сломал это в двух классах. Создать DailyActivity без подкласса ElasticSearchValue:

public class DailyActivity {
  // the same content as your class above

затем создайте еще один класс:

public class ElacticDailyActivity extends ElasticSearchValue<DailyActivity> {

Ответ 3

Попробуйте @JsonIdentityInfo аннотацию, приведенную в этом примере. Подробнее здесь http://wiki.fasterxml.com/JacksonFeatureObjectIdentity

@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public class Identifiable
{
    public int value;

    public Identifiable next;
}

Ответ 4

SerializationFeature имеет свойство с именем FAIL_ON_SELF_REFERENCES умолчанию - true но вы можете установить значение false чтобы пропустить этот тип исключения.

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.FAIL_ON_SELF_REFERENCES, false);

Если вы используете SpringBoot, вы можете просто добавить spring.jackson.serialization.fail-on-self-references=false в ваше application.properties

Ответ 5

Думаю, где-то в вашем коде. Предыдущий из некоторых примеров DailyActivity указывает на себя.