2017-01-18 4 views
0

개체의 JSON 직렬화에 문제가 있습니다. 개체가 제대로 구축 (I는 "그것은 모든 데이터가 디버깅 적이 있지만, 그것이 있어야로 직렬화 아니에요). Java Spring에서 여러 OneToMany 컬렉션을 JSON에 직렬화

이 학생 클래스가

public class Student extends AbstractUser { 

    ... 

    @OneToMany(mappedBy = "student", fetch = FetchType.EAGER, targetEntity = ActivityAttendance.class, cascade = CascadeType.ALL) 
    @Fetch(value = FetchMode.SUBSELECT) 
    private List<ActivityAttendance> attendances; 

    @OneToMany(mappedBy = "student", fetch = FetchType.EAGER, targetEntity = ActivityGrade.class, cascade = CascadeType.ALL) 
    @Fetch(value = FetchMode.SUBSELECT) 
    private List<ActivityGrade> grades; 

    ... 
} 

사용자 정의 학생 시리얼 (

를 사용 ActivityAttendance에 의해, ActivityGrade 클래스는 무한 재귀) 여기

public class CustomStudentSerializer extends StdSerializer<Student> { 

... 

@Override 
public void serialize(
     Student student, 
     JsonGenerator generator, 
     SerializerProvider provider) 
     throws IOException, JsonProcessingException { 

     ... 
     student.setAttendances(null); 
     student.setGrades(null); 
     ... 

     generator.writeObject(student); 
    } 
} 

내가 액티브에 포함 된 학생들 속성의 출석/성적 제거를 제거하는 ActivityAttendance, ActivityGrade 객체

그러나 JSON 출력은 항상 두 개의 모음 중 하나의 결과 만 반환합니다. 성적 입력란에는 개체 목록도 포함되어야하지만 항상 null을 반환합니다.

{ 
    "id": 1, 
    "firstName": "test", 
    "lastName": "test", 
    "email": "[email protected]", 
    "attendances": [ 
    { 
     "id": {}, 
     "student": { 
     ... 
     }, 
     "activity": { 
     ... 
     } 
    } 
    ], 
    "grades": null 
} 

요소를 표시하는 성적 필드가 필요합니다. 컨트롤러에는 객체가 모든 데이터를 가지고 있습니다.

참석 필드를 제거하면 등급이 올바르게 표시됩니다. 이 문제를 일으키는 원인이 무엇인지, 어떻게 해결할 수 있습니까? 고맙습니다.

답변

0

무한 재귀를 방지하려면 DTOs을 사용할 수 있습니다. 기본적으로 DTO은 동일한 필드 (id 제외)가 있어야하고 Jackson이 일련 번호 지정을 수행하도록해야합니다. 당신이 단지 메소드를 구현하여 ObjectController를 통해 반환
당신의 Entity 또는 Entity
예 (ObjectMapper 또는 getters & setters) EntityDTO로 변환 Controller :

@GetMapping 
ResponseEntity getStudent(@PathParam("firstName")String firstName){ 
    studentRepository.findStudentByFirstName(firstName).toDTO(); 
} 

URL이 localhost:8080/students/firstName

처럼 보일 수 있습니다 나는 그것을 시도하고 아무런 문제가 없었다. 2 lists

+0

나는 해냈다. ModelMapper를 사용하여 Student에서 Student로 맵핑 한 다음 이제는 정상적으로 작동합니다. 난 아직도 왜 이런 식으로 작동하는지 이해하지 못합니다 (주석이없는 거의 동일한 객체이기 때문에). 그러나 좋은 해결책입니다. 감사. –

+0

다행이었습니다. 'GET' 또는'POST'를 통해'Entity'를 리턴해서는 안됩니다. 제 의견으로는 이것이 올바른 방법이며 훨씬 더 쉽고 편리합니다. –

관련 문제