Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

Stack overflow при создании объекта

При создании GET в ответе получаю Stackoveflow ошибку
Имеется контроллер для ответа
@Controller public class TaskViewController {
@Autowired private TaskService taskService;
@RequestMapping(value = "/task/view", method = RequestMethod.GET) public @ResponseBody AjaxResponseBody getTask(@RequestParam String text) {
int id; AjaxResponseBody result = new AjaxResponseBody(); Task task; System.out.println(text);
try { id = Integer.parseInt(text); } catch (Exception e) { result.setMsg("Invalid task number"); return result; }
task = taskService.findById(id);
if (task == null){ result.setMsg("Task not found"); return result; }
result.setTask(task); return result; } }
Он использует класс для ответа AjaxResponseBody
public class AjaxResponseBody {
private String msg; private Task task;
public String getMsg() { return msg; }
public void setMsg(String msg) { this.msg = msg; }
public Task getTask() { return task; }
public void setTask(Task task) { this.task = task; } }
При выполнении работы контроллера выходит ошибка
2017-11-24 10:47:10.514 WARN 1448 --- [nio-8080-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Infinite recursion (StackOverflowError) (through reference chain: tracker.models.Project_$$_jvstd06_4["user"]->tracker.models.User_$$_jvstd06_5["watched_project"]->tracker.models.Project_$$_jvstd06_4["user"]->tracker.models.User_$$_jvstd06_5["watched_project"]->tracker.models.Project_$$_jvstd06_4["user"]->tracker.models.User_$$_jvstd06_5["watched_project"]->tracker.models.Project_$$_jvstd06_4["user"]->tracker.models.User_$$_jvstd06_5["watched_project"]->
Как я понял это происходит из-за того что модель User и Project имеют ссылки друг на друга. В модели User есть необязательное поле
@Entity @Table(name = "users") public class User { @ManyToOne(fetch = FetchType.LAZY) private Project watched_project;
public Project getWatched_project() { return watched_project; }
public void setWatched_project(Project watched_project) { this.watched_project = watched_project; }
В то же время в модели Project есть поле с автором проекта:
@Entity @Table(name = "projects") public class Project { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private int id; @Column(nullable = false) @NotEmpty(message = "*Please provide project name") private String projectName; @ManyToOne(optional = false, fetch = FetchType.EAGER) private User user; public User getUser() { return user; }
public void setUser(User user) { this.user = user; }
Есть возможность прервать рекурсию на первой иттерации? Либо какой-то другой выход из ситуации?


Ответ

использовал JsonIgnor:
@ManyToOne(fetch = FetchType.LAZY) @JsonIgnore private Project watched_project;

Комментариев нет:

Отправить комментарий