2015-05-19 16 views
7

używam projections funkcję Wiosna Danych reszta w celu pewne zagnieżdżone wpisany obiektów wewnątrz JSON:Dodaj linki do projekcji zagnieżdżonego obiektu

{ 
    "id": 1, 
    "name": "TEST", 
    "user": { 
     "id": 1, 
     "name": "user1" 
    }, 
    _links: { 
     self: { 
      href: "http://localhost:8082/accounts/1{?projection}", 
      templated: true 
     }, 
     user: { 
      href: "http://localhost:8082/accounts/1/users" 
     }, 
    } 
} 

Jak mogę wygenerować linki wewnątrz zagnieżdżonego obiektu? Chcę następującą reprezentację JSON:

{ 
     "id": 1, 
     "name": "TEST", 
     "user": { 
      "id": 1, 
      "name": "user1", 
      _links: { 
       self: { 
        href: "http://localhost:8082/users/1", 
        templated: true 
       }, 
      } 
     }, 
     _links: { 
      self: { 
       href: "http://localhost:8082/accounts/1{?projection}", 
       templated: true 
      }, 
      user: { 
       href: "http://localhost:8082/accounts/1/users" 
      }, 
     } 
    } 

P.S. Widziałem this question, ale nie mam pojęcia, jak go używać w moim przypadku (jeśli to w ogóle możliwe)

+1

Czy próbowałeś ostatnio migawki Spring REST? Ostatnio zmodyfikowaliśmy nieco domyślne renderowanie linków do projekcji? –

+0

@OliverGierke Dzięki, sprawdzi to! – nKognito

+1

@OliverGierke Czy możesz wskazać mi gdzie powinienem wyglądać? – nKognito

Odpowiedz

1

Natknąłem się na to pytanie, szukając rozwiązania. Po kilku zabawach z Spring Data REST docs section on Excerpts dowiedziałem się, jak to osiągnąć.

Zakładam, że Account jest twoim głównym obiektem i chcesz, aby miał on zagnieżdżoną kolekcję Users, gdzie każdy użytkownik z kolei ma _links.

1: Dodaj Excerpt dla Users obiektu (jest to przydatna technika zresztą ukryć nieistotne szczegóły dotyczące zbiorów lista)

@Projection(name = "userExcerpt", types = { User.class }) 
public interface UserExcerpt { 
    String getName(); 
    String getEmail(); 
    ... 
} 

2: Skojarzenie Excerpt ze swoją UserRepository

@RepositoryRestResource(excerptProjection = UserExcerpt.class) 
public abstract interface UserRepository extends JpaRepository<User, Long> ... 

3: Dodaj Projection dla Account:

@Projection(types = {Account.class}) 
public interface AccountUsersProjection { 

    String getName(); 
    ... 
    Set<UserExcerpt> getUsers(); 
} 

Ważną nieco tutaj jest to, że Projekcja musi odwoływać UserExcerpt zamiast User. W ten sposób wynik zwrócony z GET /accounts/projection=accountUsersProjection będzie wyglądać następująco:

{ 
    "_embedded" : { 
    "accounts" : [ { 
     "name" : "ProjA", 
     "users" : [ { 
     "name" : "Customer Admin", 
     "email" : "[email protected]", 
     "_links" : { 
      "self" : { 
      "href" : "http://localhost:8080/users/2{?projection}", 
      "templated" : true 
      }, ... 
     } 
     } ], 
     "_links" : { 
     "self" : { 
      "href" : "http://localhost:8080/accounts/1" 
     }, 
     ... 
     } 
    } ] 
    }, 
    "_links" : { 
    "self" : { 
     "href" : "http://localhost:8080/accounts" 
    }, 
    ... 
    }, 
    "page" : { 
    "size" : 50, 
    "totalElements" : 2, 
    "totalPages" : 1, 
    "number" : 0 
    } 
}