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<> то все работает!
  • Вопрос задан
  • 831 просмотр
Решения вопроса 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 для списка животных, а в животном уберите ссылку на клиента
Ответ написан
Можно глянуть вот сюда, а еще на мой ответ по схожему вопросу вот тут
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
29 мар. 2024, в 17:04
5000 руб./за проект
29 мар. 2024, в 17:03
3000 руб./за проект
29 мар. 2024, в 16:58
3000 руб./за проект