Я использую Spring MVC и JSON для выполнения некоторых задач, и у меня есть это исключение

Я искал три дня, и моя ошибка все еще существует, я пробовал много решений без какого-либо положительного результата!

У меня есть отношения ManyToMany, и вот мое сопоставление JPA:

Открытый класс @Entity Facteur реализует Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long idF;

.....

@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
@JoinTable(name="Affectation",joinColumns=@JoinColumn(name="IdF"), inverseJoinColumns=@JoinColumn(name="idT"))
private List<Tournee> tournees;

.......

}

Класс "Tournee" такой

Открытый класс @Entity Tournee реализует Serializable {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int idT;

....
@ManyToMany(mappedBy="tournees")
@LazyCollection(LazyCollectionOption.FALSE)
private List<Facteur> facteurs;

....

}

вот мой контроллер:

@RequestMapping(value="/getFacteur/", method=RequestMethod.GET)
@ResponseBody
public Facteur getFacteurById(@RequestParam("id") Long idF) {
    Facteur f = facteurService.getById(idF);
    System.out.println(f.toString());
    return f;
}

и код JQuery:

$(document).ready(function() {
        $(".updatelink").click(function() {
            var facteurId = $(this).data("facteur-id");
            $.ajax({
                type : "GET",
                url : "http://localhost:8080/distribution/facteur/getFacteur/",
                data : { id : facteurId },
                success : function(data) {
                            alert('SUCCESSS');
                            },
                error : function(){
                            alert("ERROR");
                }
            });
        });
    });

Любые решения?

С наилучшими пожеланиями !


person Rachid KABBAB    schedule 06.09.2017    source источник
comment
GRAVE: Servlet.service() для сервлета [appServlet] в контексте пути [/distribution] вызвал исключение [Ошибка обработки запроса; вложенным исключением является org.springframework.http.converter.HttpMessageNotWritableException: не удалось написать JSON: бесконечная рекурсия (StackOverflowError) (через цепочку ссылок: org.hibernate.collection.PersistentBag[0]->ma.pm.distribution.entities.Tournee[ facteurs]-›org.hibernate.collection.PersistentBag[0]-›ma.pm.distribution.entities.Facteur[tournees]-   -  person Rachid KABBAB    schedule 06.09.2017


Ответы (2)


Одна из двух сторон отношения не должна быть сериализована, чтобы избежать бесконечного цикла, который вызывает ошибку переполнения стека. Вы можете использовать @JsonManagedReference и @JsonBackReference, чтобы избежать ошибки:

//class Facteur
@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
@JoinTable(name="Affectation",joinColumns=@JoinColumn(name="IdF"), inverseJoinColumns=@JoinColumn(name="idT"))
@JsonManagedReference
private List<Tournee> tournees;
//class Tournee
@ManyToMany(mappedBy="tournees")
@LazyCollection(LazyCollectionOption.FALSE)
@JsonBackReference
private List<Facteur> facteurs;

Добавьте @JsonManagedReference в прямую часть отношения, которое вы хотите сериализовать, и добавьте @JsonBackReference в заднюю часть отношения, которое не будет сериализовано. На самом деле, если вы сериализуете экземпляр Tournee в JSON, вы не получите экземпляр массива Facteur. Чтобы избежать этого недостатка, просто используйте простой @JsonIgnore, но имейте в виду, что поэтому геттеры и сеттеры будут игнорироваться во время сериализации.

person skoestlmeier    schedule 06.09.2017
comment
Вы хотите сказать, что я должен использовать три аннотации, которые вы описали одновременно? Потому что я уже сделал JsonManagedReference JsonBackReference, но без каких-либо результатов! - person Rachid KABBAB; 06.09.2017
comment
Да, вы можете одновременно использовать упомянутые выше аннотации. Посмотрите этот блог для получения дополнительной информации. - person skoestlmeier; 11.09.2017

Вы столкнулись с ошибкой stackoverflow, так как класс Facteur имеет ссылку на tournees, а Tournees, в свою очередь, ссылается на Facteur — циклическую ссылку при сериализации JSON.
Просто добавьте аннотацию @JsonIgnore к объявлению private List<Tournee> tournees; в классе Facteur, и все будет в порядке.

person Balaji Krishnan    schedule 06.09.2017
comment
Спасибо за ваш ответ, я уже пробовал, и это не решает проблему для меня !! - person Rachid KABBAB; 06.09.2017
comment
интересно, какую библиотеку вы используете для сериализации json.. например, jackson/gson и т. д.. и опубликуйте полную трассировку стека в вопросе - person Balaji Krishnan; 07.09.2017
comment
Это сработало после множества тестов, большое спасибо, я использовал то, что вы сказали - person Rachid KABBAB; 07.09.2017