So I have this error:
ERROR [dispatcherServlet]:175 - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion ......
The board
is the parent and the visitors
is the child, the board id
is the foreign key for the visitors
.
This is my code :
The Model of the Visitors :
package com.hella.eTop5.eTopLogic.entity;
import net.minidev.json.annotate.JsonIgnore;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.*;
import javax.transaction.Transactional;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@Entity
@Table(name = "visitors")
@Transactional
@EnableTransactionManagement
public class Visitors {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "id")
private Long id;
// @Column
// private int boardId;
@Column
private Date date;
@Column
private String visitors;
// test
@ManyToOne
@JoinColumn(name = "board_id")
private Board boardId;
// test
public Visitors() {
}
public Visitors( Board boardId, Date date, String visitors) {
this.boardId = boardId;
this.date = date;
this.visitors = visitors;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Board getBoardId() {
return boardId;
}
public void setBoardId(Board boardId) {
this.boardId = boardId;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getVisitors() {
return visitors;
}
public void setVisitors(String visitors) {
this.visitors = visitors;
}
@Override
public String toString() {
return "Visitors{" +
"id=" + id +
", boardId=" + boardId +
", date=" + date +
", visitors='" + visitors + '\'' +
'}';
}
// @Override
// public boolean equals(Object o) {
// if (this == o) return true;
// if (o == null || getClass() != o.getClass()) return false;
//
// Visitors visitors = (Visitors) o;
//
// return Objects.equals(id, visitors.id);
// }
//
// @Override
// public int hashCode() {
// return id != null ? id.hashCode() : 0;
// }
}
This is my Repo :
package com.hella.eTop5.eTopLogic.repository;
import com.hella.eTop5.eTopLogic.entity.Top3;
import com.hella.eTop5.eTopLogic.entity.Visitors;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Optional;
public interface VisitorsRepository extends JpaRepository<Visitors, Long>{
}
This is my Service :
package com.hella.eTop5.eTopLogic.service;
import com.hella.eTop5.eTopLogic.entity.Top3;
import com.hella.eTop5.eTopLogic.entity.Visitors;
import java.util.List;
public interface VisitorsService {
List<Visitors> getAllVisitors();
}
This is my Service Impl :
package com.hella.eTop5.eTopLogic.service.implementation;
import com.hella.eTop5.eTopLogic.entity.Top3;
import com.hella.eTop5.eTopLogic.entity.Visitors;
import com.hella.eTop5.eTopLogic.repository.VisitorsRepository;
import com.hella.eTop5.eTopLogic.service.VisitorsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class VisitorsServiceImpl implements VisitorsService {
private final VisitorsRepository visitorsRepository;
@Autowired
public VisitorsServiceImpl(VisitorsRepository visitorsRepository) {
this.visitorsRepository = visitorsRepository;
}
@Override
public List<Visitors> getAllVisitors() {
return visitorsRepository.findAll();
}
}
This is my controller :
package com.hella.eTop5.eTopLogic.controller;
import com.hella.eTop5.eTopLogic.entity.Visitors;
import com.hella.eTop5.eTopLogic.repository.VisitorsRepository;
import com.hella.eTop5.eTopLogic.service.VisitorsService;
import com.hella.eTop5.eTopLogic.service.implementation.VisitorsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.transaction.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@Configuration
@Controller
@RequestMapping("/visitors")
public class VisitorsController {
private final VisitorsService visitorsService;
private final VisitorsRepository visitorsRepository;
@Autowired
public VisitorsController(VisitorsService visitorsService, VisitorsRepository visitorsRepository) {
this.visitorsService = visitorsService;
this.visitorsRepository = visitorsRepository;
}
@GetMapping("/getVisitors")
public ResponseEntity<List<Visitors>> getVisitors(){
var allVisitors = visitorsService.getAllVisitors();
return new ResponseEntity(allVisitors, HttpStatus.OK);
}
}
And this is my board model :
( between test ========== and end ======= is my code snipper ) ;
package com.hella.eTop5.eTopLogic.entity;
import com.hella.eTop5.userManagement.entity.User;
import net.minidev.json.annotate.JsonIgnore;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.*;
import javax.transaction.Transactional;
import javax.validation.constraints.NotNull;
import java.util.*;
@Entity
@Transactional
@EnableTransactionManagement
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "id", nullable = false)
private Long id;
@NotNull
@Column(name = "name")
private String name;
@Column(name = "membersOnly")
private boolean membersOnly = false;
@Column(name = "notificationActive")
private boolean notificationActive = false;
@Column(name = "enabled", columnDefinition = "boolean default true")
private boolean enabled = false;
@ManyToOne
@JoinColumn(name = "plant_id", nullable = true)
private Plant plantBoard;
@ManyToOne
@JoinColumn(name = "uap_id", nullable = true)
private UAP uapBoard;
@ManyToOne
@JoinColumn(name = "gap_id", nullable = true)
private GAP gapBoard;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "board_users", joinColumns = @JoinColumn(name = "board_id"), inverseJoinColumns = @JoinColumn(name = "user_id"))
private Set<User> userBoardList = new LinkedHashSet<>();
@ManyToMany(mappedBy = "adminBoards")
private Set<User> adminUserBoardList = new LinkedHashSet<>();
@OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<ListOfTasks> listOfTasks = new LinkedHashSet<>();
@OneToMany(mappedBy = "boardEntity", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Presentation> presentationList = new LinkedList<>();
// test =========================================================
@OneToMany(mappedBy = "boardId", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonIgnore
private List<Visitors> visitors = new LinkedList<>();
// end ===============================================================
@Column(name = "meeting_duration")
private Integer meetingDuration;
@Column(name = "start_time")
private String startTime;
public Board() {
}
public Board(String name) {
this.name = name;
}
public Board(Long id, String name, GAP gapBoard) {
this.id = id;
this.name = name;
this.gapBoard = gapBoard;
}
public void addListOfTasks(ListOfTasks listOfTasks) {
this.listOfTasks.add(listOfTasks);
listOfTasks.setBoard(this);
}
public void removeListOfTasks(ListOfTasks listOfTasks) {
this.listOfTasks.remove(listOfTasks);
listOfTasks.setBoard(null);
}
public void addUser(User user) {
this.userBoardList.add(user);
user.addBoard(this);
}
public void removeUser(User user) {
this.userBoardList.remove(user);
user.removeBoard(this);
}
public void addAdminUser(User user) {
this.adminUserBoardList.add(user);
user.addAdminBoard(this);
}
public void removeAdminUser(User user) {
this.adminUserBoardList.remove(user);
user.removeAdminBoard(this);
}
public void addPresentation(Presentation presentation) {
this.presentationList.add(presentation);
presentation.setBoardEntity(this);
}
public void removePresentation(Presentation presentation) {
this.presentationList.remove(presentation);
presentation.setBoardEntity(this);
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public String getNameToLowerCase() {
return name.toLowerCase();
}
public void setName(String name) {
this.name = name;
}
public Plant getPlantBoard() {
return plantBoard;
}
public void setPlantBoard(Plant plant) {
this.plantBoard = plant;
}
public UAP getUapBoard() {
return uapBoard;
}
public void setUapBoard(UAP uap) {
this.uapBoard = uap;
}
public GAP getGapBoard() {
return gapBoard;
}
public void setGapBoard(GAP gap) {
this.gapBoard = gap;
}
public boolean getMembersOnly() {
return membersOnly;
}
public void setMembersOnly(boolean membersOnly) {
this.membersOnly = membersOnly;
}
public boolean getNotificationActive() {
return notificationActive;
}
public void setNotificationActive(boolean notificationActive) {
this.notificationActive = notificationActive;
}
public boolean getEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public Set<User> getUserBoardList() {
return userBoardList;
}
public void setUserBoardList(Set<User> userBoardList) {
this.userBoardList.clear();
this.userBoardList.addAll(userBoardList);
}
public Set<User> getAdminUserBoardList() {
return adminUserBoardList;
}
public void setAdminUserBoardList(Set<User> adminUserBoardList) {
this.adminUserBoardList.clear();
this.adminUserBoardList.addAll(adminUserBoardList);
}
public Set<ListOfTasks> getListOfTasks() {
return listOfTasks;
}
public void setListOfTasks(Set<ListOfTasks> listOfTasks) {
this.listOfTasks.clear();
this.listOfTasks.addAll(listOfTasks);
}
public Integer getMeetingDuration() {
return meetingDuration;
}
public void setMeetingDuration(Integer meetingDuration) {
this.meetingDuration = meetingDuration;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Board board = (Board) o;
return Objects.equals(id, board.id);
}
@Override
public int hashCode() {
return id != null ? id.hashCode() : 0;
}
@Override
public String toString() {
return "Board{" +
"id=" + id +
", name='" + name + '\'' +
", isMembersOnly=" + membersOnly +
", notificationActive=" + notificationActive +
", isActive=" + enabled +
", gapBoard=" + gapBoard +
", userBoardList=" + userBoardList +
'}';
}
}