Java stackoverflow创建对象
当我创建GET响应时,出现了Stackoveflow错误 应答控制器Java stackoverflow创建对象,java,spring,Java,Spring,当我创建GET响应时,出现了Stackoveflow错误 应答控制器 @Controller public class TaskViewController { @Autowired private TaskService taskService; @RequestMapping(value = "/task/view", method = RequestMethod.GET) public @ResponseBody AjaxResponseBody
@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;
}
}
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;
}
}
他用AjaxResponseBody类作为答案
@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;
}
}
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"]->
我是如何理解这种情况的,因为模型用户和模型项目彼此有链接。模型用户有一个可选字段“监视的项目”
并且模型项目具有字段,而不是empriy字段“author”:
我怎么能放弃它?或者任何方式?JSON序列化尝试序列化对象,并且您有循环引用。关于这件事,有很多疑问。如果您使用的是Jackson,那么您可以对
项目中的对象用户或用户项目中的对象使用注释@JsonIgnore
您还可以使用@JsonManagedReference
和@JsonBackReference
作为答案。用户如何与项目建立多对一关系,项目如何与用户建立多对一关系?我认为其中一个应该是一对多