2015-05-19 26 views
7

tôi sử dụng tính năng mùa xuân dữ liệu REST của của projections để có một số đối tượng lồng nhau, đánh máy bên trong JSON:Thêm liên kết vào chiếu của đối tượng lồng nhau

{ 
    "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" 
     }, 
    } 
} 

Làm thế nào tôi có thể tạo ra các liên kết bên trong đối tượng lồng nhau? Tôi muốn đại diện JSON sau đây:

{ 
     "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. Tôi thấy this question, nhưng không có ý tưởng về cách sử dụng nó trong trường hợp của tôi (nếu có thể)

+1

Bạn đã thử chụp nhanh Spring Data REST gần đây chưa? Chúng tôi đã tinh chỉnh một chút về kết xuất liên kết mặc định cho các dự báo gần đây? –

+0

@OliverGierke Cảm ơn, sẽ kiểm tra! – nKognito

+1

@OliverGierke Bạn vui lòng chỉ cho tôi xem tôi nên tìm ở đâu? – nKognito

Trả lời

1

Tôi tình cờ gặp câu hỏi này, tìm kiếm giải pháp. Sau một số khó khăn với Spring Data REST docs section on Excerpts Tôi đã tìm ra cách để đạt được điều này.

Tôi giả định Account là đối tượng gốc của bạn và bạn muốn nó có bộ sưu tập lồng nhau là Users, trong đó mỗi người dùng lần lượt có _links.

1: Thêm một Excerpt cho đối tượng Users (đây là một kỹ thuật có ích anyway để ẩn chi tiết quan trọng về bộ sưu tập danh sách)

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

2: Kết hợp các Excerpt với bạn UserRepository

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

3: Thêm Projection cho Account:

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

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

Các bit quan trọng ở đây là chiếu của bạn cần phải tham khảo UserExcerpt thay vì User. Bằng cách này, kết quả trả lại từ GET /accounts/projection=accountUsersProjection sẽ có dạng như sau:

{ 
    "_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 
    } 
} 
Các vấn đề liên quan