2015-10-07 58 views
0

控制器从ajax调用时返回Java.lang.stackoverflow错误。Ajax在spring中返回java.lang.stackoverflow错误

我的Ajax函数是这样的。

$.ajax({ 
    url: '${pageContext.servletContext.contextPath}/exam/test', 
    type: 'POST', 
    data: 'examName='+examName, 
    success: function(response) { 
     alert(response); 
    } 
}); 

控制器

@RequestMapping(value = "/exam/test", method = RequestMethod.POST) 
public @ResponseBody List<SchoolExam> examsTest(@ModelAttribute(value = "examName") String examName, BindingResult result, WebRequest webRequest, ModelMap map, Principal principal) { 

    User loggedUser = userService.getUserByUserName(principal.getName()); 

    *********************** 
     Some code here 
    *********************** 

    List<SchoolExam> schoolExams = new ArrayList<SchoolExam>(); 

    for (School school : schools) { 
     if (student) { 
      Set<Student> students = school.getStudents(); 
      for(Student std : students) { 
       if (std != null && !std.isEmpty()) { 
        schoolExams.add(new SchoolExam(std, true)); 
       } 
      } 
     } 
     if (teacher) { 
      Set<Teacher> teachers = school.getEvents(); 
      for (Teacher tchr : teachers) { 
       if (loggedUser.equals(tchr.getOwner())) { 
        schoolExams.add(new SchoolExam(tchr, true)); 
       } 
      } 
     } 
     if (exam) { 
      Set<Exam> exams = school.getCampaigns(); 
      for (Exam exam1 : exams) { 
       if (loggedUser.equals(exam1.getOwner())) { 
        schoolExams.add(new SchoolExam(exam1, true)); 
       } 
      } 
     } 
    } 
    return schoolExams; 
} 

SchoolExam

public SchoolExam(Object obj, boolean editable) { 
    this.editable = editable; 
    if (obj instanceof Student) { 
     Student student = (Student) obj; 
     this.id = student.getId(); 
     this.name = student.getName(); 
     this.type = Constants.Student; 
     this.obj = student; // <-- This is causing issue here 
    } 
    if (obj instanceof Teacher) { 
     Teacher teacher = (Teacher) obj; 
     this.id = teacher.getId(); 
     this.name = teacher.getName(); 
     this.type = Constants.Teacher; 
     this.obj = teacher; // <-- This is causing issue here 
    } 
    if (obj instanceof Exam) { 
     Exam exam = (Exam) obj; 
     this.id = exam.getId(); 
     this.name = exam.getName(); 
     this.type = Constants.Exam; 
     this.obj = exam; // <-- This is causing issue here 
    } 
} 

问题:

这是实效F INE当形式提交,然后我可以在JSP运行foreach循环使用的所有数据,但是当我试图在我的函数返回列表,然后阿贾克斯成功地工作,同时也还给我响应

response in ajax

[ 
    { 
     "id":"2123244", 
     "name":"UK School", 
     "type":"exam", 
     "editable":true, 
     "obj": 
     { 
      "id":"2123244", 
      "authorizationRequired":false, 
      "owner": 
      { 
       "id":"5676764554", 
       "company": 
       { 
        "id":"55435435345", 
        "name":"SchoolTest Software", 
        "enabled":true, 
        "size":3, 
        "sector":null, 
        "phone":"1231231232", 
        "schoolFees":5000, 
        "location":"US", 
        "users": 
          [ 
           { 
            "id":"5676764554", 
            "company": // <-- Start Repeating here 
              { 
               "id":"55435435345", 
               "name":"SchoolTest Software", 
               "enabled":true, 
               "size":3, 
               "sector":null, 
               "phone":"1231231232", 
               "schoolFees":5000, 
               "location":"US", 
               "users": 
                 [ 
                  { 
                   "id":"5676764554", 
                   "company": // <-- Repeating again 
                     { 
                     "id":"55435435345", 
                     "name":"SchoolTest Software", 
                     "enabled":true, 
                     "size":3, 
                     "sector":null, 
                     "phone":"1231231232", 
                     "schoolFees":5000, 
                     "location":"US", 
                     "users": 
                       [ 
                        { 
                         "id":"5676764554", 
                         "company":// <-- It keeps repeating it self 

但是当我试图在控制器中打印列表值时,它只打印一个值。

e.g:

for (SchoolExam schoolExam : schoolExams) { 
    System.out.println("Name: " + schoolExam.getName()); 
    System.out.println("ID: " + schoolExam.getId()); 
    Exam exam = (Exam) schoolExam.getObj(); 
    System.out.println("Exam Name: " + exam.getName()); 
} 

Output: 

Name: UK School 
ID: 2123244 
Exam Name: UK School 

注:

如果我评论的obj线然后一切工作正常,我。 e.g:

this.obj = student; 
this.obj = teacher; 
this.obj = exam; 

但我需要用它来获取数据,因为它包含了不同的表中的数据。

请查阅this file查看我在控制台中获得的错误日志。

所以,我在做什么错误导致此问题或我需要使用任何其他方式来防止此问题。

任何建议或链接将有所帮助。

+0

Java服务器控制台或日志中的任何错误堆栈? – Magus

+0

实际上有消息与java.lang.stackoverflow相关,但它们是两个大的,因此在我看到它们被替换之前它们是两个。 – Luffy

+1

如果要记录到控制台,请尝试增加控制台的buffersize或登录到文件。 – hotzst

回答

0

根据您的错误日志文件,您在Java类中有循环递归。所以杰克逊试图无限序列化一些物体。

的主要问题是在这里:com.school.model.Company_$$_javassist_8["users"]->org.hibernate.collection.PersistentSet[0]->com.school.model.User["company"]->com.school.model.Company_$$_javassist_8["users"]

你有一个属性users含含物业ompany containr含有相同users一个Company一套User。如此无限循环。

+0

感谢您的回复。但是,当我将值放入地图并尝试将其放在其他页面上时,相同的代码工作正常。 – Luffy