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

266
25 ноября 2017, 09:59

При создании 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;
    }

Есть возможность прервать рекурсию на первой иттерации? Либо какой-то другой выход из ситуации?

Answer 1
@ManyToOne(fetch = FetchType.LAZY)
private Project watched_project; 

и

@ManyToOne(optional = false, fetch = FetchType.EAGER)
private User user

Определитесь что из этого ManyToOne,а что OneToMany.

READ ALSO
как правильно добавить технологию primefaces

как правильно добавить технологию primefaces

хочу реализовать возможности primefaces в моем проекте но скорее всего добавление jar файла primefaces в библиотеку проекта не помогает,подскажите...

279
Запрос геолокации с браузера

Запрос геолокации с браузера

Какими методами можно делать запросы с браузера на геолокацию ? Чтобы возвращало на подобии такого: 43048538, 44

265