2017-12-18 24 views
0

내가 JSON 결과를 기록 내 SpringMVC RestController에 문제가있는 작동 : 나는 아래와 같이 도메인 개체를 반환하는 경우RestController에서 반환 된 도메인 객체로 인해 AJAX 오류가 발생합니다. 사용자 정의 모델 개체

1), ActivitiesT, 나는 클라이언트 -에 AJAX를 500 내부 서버 오류 측면.

@RequestMapping("/participant/activityForEvent") 
public ActivitiesT getActivityForGuiEventId() throws Exception { 
    ActivitiesT activitiesT = participantService.getActivity(); 
    return activitiesT; 
} 

ActivitiesT 도메인 오브젝트는, Hiberate는 생성 : 나는 POJO정의를 반환 할 때

@Entity 
@Table(name = "activities_t", schema = "public") 
public class ActivitiesT implements java.io.Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    private int id; 
    //... etc... 
} 

2) 그러나이 AJAX와 방법을 사용할 수 있습니다. 거의 동일합니다.

@RequestMapping("/participant/activityForEvent") 
public ActivitiesT getActivityForGuiEventId() throws Exception { 
    ActivitiesT activitiesT = participantService.getActivity(); 
    // Create a custom Activity POJO and return it 
    return new Activity(activitiesT.id, activitiesT.title); 
} 

활동 정의 POJO :

public class Activity implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public int id; 
    public String title; 
    //etc. 

오류 메시지

HTTP Status 500 - Could not write JSON: could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy - 

(참조 체인을 통해 : com.myapp ") 아무 세션주의해야 할

어떤 것들은 :

  • 두 개체가 Serializable를 구현하고, 그 문제는 DAO, 나는 우리가 컨트롤러가 @RestController로 주석하는 DAO 조각
  • 을 무시할 수는 DAO는 항상 모두에 대한 정확한 데이터를 반환 참조 할 수 있으므로되지
  • 괜찮아요 그 항상 JSON을 출력합니다. ResponseBody 나 이전 태그가 필요하지 않습니다.

문제가있는 위치에 대한 의견이 있으십니까? 문제는이 아래로 비등 :

  • ,

    • 내가 @Entity 최대 절전 모드에서 생성 된 POJO를에 RestController 방법에서 JSON을 반환 할 수 없습니다하지만 난 내 자신의 사용자 정의 POJO를에 RestController 방법에서 JSON을 반환 할 수 있습니다
  • +1

    던져진 예외를 제공 할 수 있습니까 ('500 내부 서버 오류')? – lzagkaretos

    +0

    서버 쪽에서 예외가 발생하지 않으면 컨트롤러가 확인을 완료합니다. 클라이언트 측에서 AJAX JS를 얻을 때 Firebug에서 500 내부 서버 오류 만 표시됩니다. –

    +1

    500 내부 서버 오류는 서버 측에서 문제가 있음을 나타냅니다. 이런 종류의 문제를 대형 객체의 직렬화에서 보았습니다. 'ActivitiesT'는 컨트롤러가 값을 반환 한 후 어떤 종류의 Exception이 발생하는 단순하거나 복잡한 객체 (그냥 추측)입니다. – lzagkaretos

    답변

    1

    Jackson이 응답을 준비하면 재귀 적으로 모델 클래스를 JSON으로 변환하려고 시도합니다. 예를 들어 Department와 Employee 관계가 일대 다 관계 인 경우 Jackson은 Department.java에서 getEmployees() 메소드를 실행하여 응답을 준비합니다. 그러나 getEmployees() 메소드는 hibernate가 직원 레코드를 가져 오기 위해 다른 쿼리를 실행하도록 요구한다. Lazy 로딩으로 인한 DB. 그러나 세션은 이미 닫혔습니다. 따라서이 오류가 발생합니다. 이것을 피하려면 항상 실제 모델 클래스 대신 DTO를 사용하십시오. RestController에서 반환 된 도메인 객체는 AJAX 오류를 발생시킵니다. 사용자 정의 모델 객체가 작동합니다.

    +0

    예, 이제 모든 JSON 반환 메소드에 일반 POJO가 사용됩니다 . 감사 –