Задать вопрос

Java: Как правильно обработать Json?

Добрый день!
Вопрос вот в чем:
Есть
//Основной класс
 class Client {
  private String login;
  private Set<Pet> pets;
}

//Обрабатывает запрос, и возвращает JSON объект 
@RequestMapping(value = "/ajax", method = RequestMethod.GET)
    public @ResponseBody String ajax() throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(clientDAO.getAll()); // тут List<> (список всех клиентов, а у каждого клиента Set животных)
    }
//В jsp описал обработку данных с помощью ajax

 $.ajax({
               url: '/ajax',
                type: 'GET',
               dataType: "json",
               contentType: "application/json ",
               success: function (data) {
                   alert("Данные" + data)
               },
                error: function () {
                    alert("Ошибка при получении данных!")
                }
})


При запуске кода выскакивает исключение и ссылается на поле Set pets, подскажете как правильно реализовать ajax запрос или я не правильно отправляю данные? Если подставить произвольный объект client без Set<> то все работает!
  • Вопрос задан
  • 848 просмотров
Подписаться 1 Оценить 8 комментариев
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Как я уже писал в комментарии, у вас циклическая зависимость между Pet и Client. Выхода два - или убрать зависимость, или определить владельца связи, чтобы Hibernate мог правильно определить правило десириализации. Сделать это можно либо описав в xml правило мапинга и определив параметр inverse:

<hibernate-mapping>
    <class name="ru.misha.model.Client" table="clients" ...>
    ...
        <set name="pets" table="clients_pets" fetch="select" inverse="true">
            <key>
                <column name="client_id" not-null="true" />
            </key>
            <one-to-many class="ru.misha.model.Pet" />
        </set>
    ...
    </class>
...
</hibernate-mapping>


либо определить направление связи анотациями

@Entity
@Table(name = "clients")
public class Client extends Base {
    @OneToMany(mappedBy="client")
    @Column(name="clientId")
    private Set<Pet> pets;
}


Как-то так. Не копируйте бездумно, так как пишу по памяти и могу ошибаться в деталях. Почитайте документацию по Hibernate в заданом направлении.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@mitekgrishkin
> Infinite recursion (StackOverflowError) (through reference chain: ru.misha.model.Pet["client"]->ru.misha.model.Client["pets"]
Как я понимаю, прога тянет клиента, внутри клиента список животных. У животного вытягивается клиент, и идем по рекурсии заново. Память переполняется и приложение падает. Попробуйте либо хранить только id клиента в животном, либо добавьте OneToMany для списка животных, а в животном уберите ссылку на клиента
Ответ написан
Можно глянуть вот сюда, а еще на мой ответ по схожему вопросу вот тут
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы