M
M
Mikhail Ivanov2016-05-14 07:07:51
Java
Mikhail Ivanov, 2016-05-14 07:07:51

Java: How to properly process Json?

Good afternoon!
The question is:
Is there

//Основной класс
 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("Ошибка при получении данных!")
                }
})

When you run the code, an exception pops up and refers to the Set pets field, can you tell me how to correctly implement the ajax request, or am I not sending the data correctly? If you substitute an arbitrary client object without Set<>, then everything works!

Answer the question

In order to leave comments, you need to log in

3 answer(s)
S
Sergey Gornostaev, 2016-05-14
@Mishany

As I wrote in the comment, you have a cyclic dependency between Pet and Client. There are two ways out - either remove the dependency, or determine the owner of the connection so that Hibernate can correctly determine the deserialization rule. You can do this either by describing the mapping rule in xml and defining the inverse parameter:

<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 в заданом направлении.

M
mitekgrishkin, 2016-05-14
@mitekgrishkin

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

Павел Гаев, 2016-05-15
@Plohish81

Можно глянуть вот сюда, а еще на мой ответ по схожему вопросу вот тут

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question