Прямая самооценка, приводящая к исключению цикла
У меня есть класс; что-то вроде следующего:
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 указывает на себя.