2016-09-29 2 views
2

스프링 부트 (Jackson 사용)는 JSON 문서와 Java POJO간에 객체 매핑을 잘 처리합니다. 예를 들어 :스프링 부트로 게시 된 JSON의 엔티티 관계

{ id: 5, name: "Christopher" } 

이 수락 할 수 있습니다

@PostMapping("/students/{id}") 
public Student Update(Long studentId, @RequestBody Student student) { 

    studentRepository.save(student); 

    return student; 
} 

올바르게에 매핑 할 : JSON에서

public class Student { 
    private Long id; 
    private String name; 
    ... 
} 

그러나 대한 중첩 된 모델?

{ id: 5, name: "Christopher", grades: [ {id: 1, letter: 'A'} ] } 

또는 JSON의 옵션 모델은 무엇입니까?

{ id: 5, name: "Christopher" } 
(Purposefully leaving out 'grades', though it could be accepted.) 

JSON (예 : Rails '_destroy 플래그를 사용하여)에서 연결이 제거되었음을 나타냅니다.

{ id: 5, name: "Christopher", grades: [ {id: 1, letter: 'A', _destroy: true} ] } 

또는 ID를 제외하여 연결을 만드시겠습니까?

{ id: 5, name: "Christopher", grades: [ {letter: 'A-'} ] } 

스프링 부트가 이러한 아이디어를 지원합니까?

+0

'선택 모델'을 의미하는 경우 somethink like some ; Pojos에서 Optionals를 사용하면 안됩니다. –

+0

옵션 모델 일 필요는 없으며, JSON에 있어야하는지 여부는 선택 사항입니다. 'Student'에 'Grades'목록이 있지만 학생의 이름 만 업데이트하고 싶다면 매번 'Grades'배열을 POST하지 않아도됩니다. – Christopher

+0

필자가 설명하는 문제를 해결하기 위해 DTO (Data Transfer Object)를 사용했습니다. 또한 직렬화하지 않으려는 필드에 @JsonIgnore 주석을 추가 할 수 있습니다. –

답변

1

하지만 JSON의 중첩 모델은 어떻게해야하나요? 당신은 아마 예상하는대로

중첩 모델, 매핑되는 다음과 같은 모델을 가지고 가정

public class Product { 
    private String name; 
    private List<Price> prices; 
} 


public class ProductPrice { 
    Long idPrice; 
    Integer amountInCents; 
} 

잭슨이 스키마에서 다음 JSON을 만들 것입니다 :

{ 
    "name":"Samsung Galaxy S7", 
    "prices":[ 
     { 
       "idPrice":0, 
       "amountInCents": 100 
     } 
    ] 
} 

또는 JSON의 선택 모델?

@JsonIgnore로 필드의 주석을 달 수 있습니다. 예를 들어, 가격에 @JsonIgnore로 주석을 달면 jackson으로부터 가격이 직렬화되지 않습니다.

JSON (예 : 레일스의 _destroy 플래그 사용)에서 연관이 제거되었음을 나타냅니다.

연관을 삭제하기위한 추가 매핑을 만들 것입니다. 이 API가 자기

@DeleteMapping("/students/{id}/grade/{idGrade}") 
public Student Update(Long studentId, @PathVariable Long idGrade) { 

    studentService.deleteGrade(studentId,idGrade); 

    return student; 
} 

또는

가 ID를 떠나하여 연결을 만드는 .. 설명되어 또 다른 장점이있다?

내가 여기에 또한 추가로 매핑을 만들 것입니다 :

@PostMapping("/students/{id}/grade") 
public Student Update(Long studentId, @PathVariable String grade) { 

    studentService.addGrade(studentId,grade); 

    return student; 
} 

참고 : 내가 직접 저장소를 사용하지 않는, 내가 서비스 레이어를 생성하고 모든 저장소는 패키지 보호 액세스 할 수 있습니다.서비스 계층에서 addGrade, deleteGrad, addStudent, deleteStudent 등과 같은 메소드를 작성하십시오.

+0

감사합니다. 이것은 꽤 완벽한 대답입니다. 하지만 데이터를 포함시킨 경우에만 중첩 모델을 직렬화하려면 어떻게해야합니까? @JsonIgnore는 연결이 전혀 존재하지 않는 것처럼 동작합니다. 하지만 동시에 중첩 된 객체로 객체를 생성하고 싶을 수도 있고, 아니면 그것을 생략 할 수도 있습니다. 이 동작이 지원됩니까? – Christopher

+0

필자는 한번도 해보지 않았지만 Jackson JSON Views를 살펴 본다. 나는 이것이 당신의 목표에 맞아야한다고 생각합니다. 다음은 좋은 블로그 게시물입니다. http://www.baeldung.com/jackson-json-view-annotation –

관련 문제