복붙노트

[SPRING] 선택적으로 Spring 데이터 Rest 응답의 연관을 확장합니다.

SPRING

선택적으로 Spring 데이터 Rest 응답의 연관을 확장합니다.

표준 Spring 데이터 JPA와 Spring 데이터 Rest Setup을 가지고 있으며, 올바른 리소스에 대한 링크로 연결을 올바르게 반환합니다.

{
    "id": 1,
    "version": 2,
    "date": "2011-11-22",
    "description": "XPTO",
    "_links": {
        "self": {
            "href": "http://localhost:8000/api/domain/1"
        },
        "otherDomain": {
            "href": "http://localhost:8000/api/domain/1/otherDomain"
        }
    }
}   

그러나 일부 요청에서 "otherDomain"에 대한 연결을 확장하고 싶습니다 (클라이언트가 전체 데이터를 가져 오기 위해 N + 1 요청을하지 않아도 됨).

이 방법으로 응답을 처리하기 위해 Spring Data Rest를 구성 할 수 있습니까?

해결법

  1. ==============================

    1.기본 응답은 PUT 요청의 페이로드가 GET이 반환하는 요청과 대칭이되도록 동일한 상태를 유지해야합니다. 그러나 Spring Data REST에는 다음과 같이 작동하는 projections (자세한 내용은 JIRA 티켓 참조)라는 기능이 도입되었습니다.

    기본 응답은 PUT 요청의 페이로드가 GET이 반환하는 요청과 대칭이되도록 동일한 상태를 유지해야합니다. 그러나 Spring Data REST에는 다음과 같이 작동하는 projections (자세한 내용은 JIRA 티켓 참조)라는 기능이 도입되었습니다.

    전용 인터페이스를 만들고 응답에 포함 할 모든 속성을 추가합니다.

    public interface MyProjection {
    
      String getMyProperty();
    
      MyRelatedObject getOtherDomain();
    }
    

    당신은

    그러면 도메인 유형에 대해 공개 된 리소스가 프로젝션 이름과 함께 프로젝션 매개 변수 (이름도 구성 가능한 ProjectionConfiguration)를 허용하게됩니다. 주어진 경우, 기본 렌더링 (관련 엔티티에 링크를 포함하는 대신 렌더링 렌더링을 포함)을 건너 뛰고 Jackson이 주어진 인터페이스를 지원하는 프록시를 렌더링하도록합니다.

    그 예는 Spring RESTBucks 프로젝트에서도 찾을 수 있습니다. 인터페이스 정의에 대해서는 OrderProjection을 참조하십시오.

  2. ==============================

    2.내 솔루션은 모든 요청에 ​​적용되지만 일부는 관련성이 높습니다.

    내 솔루션은 모든 요청에 ​​적용되지만 일부는 관련성이 높습니다.

    비슷한 상황이 있습니다. 사용자 개인 JSS 응답에 중첩 된 사용자 Persons 협회가 있습니다.

    {
    "_embedded":{
      "users":[
         {
            "userName":"Albert"
            "userPersons":[
               {
                  "personId":2356,
                  "activeBoolean":1
               },
               {
                  "personId":123617783,
                  "activeBoolean":1
               }
            ],
            "_links":{
               "self":{
                  "href":"http://localhost:8080/api/users/1"
               }
            }
         }
      ]
    

    } }

    내 기본 엔티티 이렇게 :

    @Entity
    public class User {
    
    
    ...
    
    @Getter @Setter
    private String userName;
    
    @Getter @Setter
    @OneToMany(mappedBy = "user")
    private Set<Userperson> userPersons;
    

    }

    단일 저장소 :

    @RepositoryRestResource
    public interface UserRepo extends JpaRepository<User, Integer> {
    }
    

    내 솔루션은 다음과 같습니다.

    단순히 UserPerson @RepositoryRestResource를 노출시키지 않으면 Spring Data Restations가 사용자의 연결을 포함하게됩니다.

    중첩 된 타입에 대해 @RepositoryRestResource를 정의하면 Spring 데이터 나머지는 리소스에 대한 링크를 렌더링하고 포함하지 않습니다.

    내부 비즈니스 로직에 중첩 된 유형 리포지토리가 필요하면 @RepositoryRestResource (exported = false)로 설정하여 동일한 동작을 유지합니다.

    1 + N 문제를 피하기 위해, 아마도이 녀석과 같이 @EntityGraph를 사용하여 eager loading에 대한 연결을 구성 할 수 있습니다. 그러나 Spring Data Rest에서 이것을 구현하는 가장 좋은 방법을 아직 찾지 못했습니다.

  3. from https://stackoverflow.com/questions/23056091/selectively-expand-associations-in-spring-data-rest-response by cc-by-sa and MIT license