2017-11-24 2 views
1

は、私は彼が答えstackoverflowの作成オブジェクト

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

ためStackoveflowエラー

コントローラーを持っています

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"]-> 

モデルのユーザーとモデルのプロジェクトにはリンクがあるため、このことがわかります。 Model Userにはオプションのフィールド "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; 
    } 

私はitterationを中止するにはどうすればよい:

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

とモデルプロジェクトはありませんempryフィールド "著者" でフィールドを持っていますか?または任意の方法ですか?

+1

ユーザーはProjectとProjectの多対1の関係にどのようにして、ユーザーと多対1の関係にありますか?それらのうちの1つは、私が思うには1対多でなければならない –

答えて

2

JSONシリアライゼーションはオブジェクトをシリアライズしようとします。循環参照があります。それについての多くの質問があります。あなたがジャクソンを使用している場合はProjectのオブジェクトのをUserまたはUserのオブジェクトの中にProjectのオブジェクトとして使用できます。

また、@JsonManagedReference@JsonBackReferenceのようにthisの回答を使用することができます。

関連する問題