【问题标题】:stackoverflow creating objectsstackoverflow 创建对象
【发布时间】:2017-11-24 19:27:04
【问题描述】:

当我创建 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 之间存在链接。模型用户有一个可选字段“watched_project”。

@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;
    }

并且模型项目具有非空字段“作者”的字段:

@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;
    }

如何中止迭代?或者任何方式?

【问题讨论】:

  • 用户如何与项目建立多对一关系,项目与用户建立多对一关系?我认为其中之一应该是一对多

标签: java spring


【解决方案1】:

JSON 序列化尝试序列化对象并且您有循环引用。 SO中有很多关于它的问题。如果您使用的是 Jackson,那么您可以在 User 内为 Project 对象或 Project 内的 User 对象使用注解 @JsonIgnore

您也可以使用@JsonManagedReference@JsonBackReference 就像在this 答案中一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多