2013-11-26 3 views
2

У меня есть класс что-то вроде этогоDirect самореференция приводит к исключению цикла

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. Я получаю следующее исключение:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Direct self-reference leading to cycle (through reference chain: com.pr.analysis.DailyActivity["previous"]) 

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

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

ответ

0

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

+0

Ya, очевидно. Позвольте мне переформулировать вопрос о том, как вы можете десериализовать объект, который имеет собственную ссылку? –

+0

Я не думаю, что вы можете. Я установил предыдущее значение null, когда он указывает на себя перед отправкой объекта. В другом конце, после получения объекта, измените предыдущее на себя, если оно равно null. Может быть, у кого-то есть лучшая идея. –

1

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

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> { 
+0

Ya, я знаю это и спрашиваю, как десериализировать такой класс? –

6

В этом случае вам нужно аннотировать отношения с @JsonManagedReference и @JsonBackReference, как это:

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

И

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

Существует хороший пример here

0

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

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

    public Identifiable next; 
} 
+0

У меня такая же проблема. Я сконфигурировал свой проект, как указано в ссылке выше, но он не работает. –

Смежные вопросы