6

câu hỏi đầu tiên ở đây vì vậy hãy nhẹ nhàng :)Dịch vụ nghỉ ngơi mùa xuân khởi động, làm thế nào để có được nó để soái các liên kết như tài sản?

Tôi có một dự án JPA mà tôi muốn hiển thị dưới dạng REST. Tôi đã làm điều này cho đến nay:

thực thể của tôi:

@Entity 
public class SignUpSheet { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Column 
    private String name; 

    @Column 
    private String description; 

    @Column 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date dateTime; 

    @ManyToOne 
    private User parent; 

    @OneToMany 
    private List<Volunteer> volunteers; 

    //getter and setters 
} 

Tất cả tốt và tốt, tôi gọi thêm mùa xuân-boot-khởi-dữ liệu còn lại để pom của tôi và bây giờ tôi nhận được một dịch vụ. Đây là JSON tôi quay lại.

http://localhost:8080/api-0.1.0/signUpSheets/1 

{ 
    "name": "Auction", 
    "description": "My First Sign Up Sheet", 
    "dateTime": "2015-04-22T03:47:12.000+0000", 
    "volunteers": [ 
    { 
    "role": "Bringing stuff", 
    "comments": "I have comments!" 
    } 
    ], 
    "endpoint": "/signUpSheets", 
    "_links": { 
    "self": { 
     "href": "http://localhost:8080/api-0.1.0/signUpSheets/1" 
    }, 
    "parent": { 
     "href": "http://localhost:8080/api-0.1.0/signUpSheets/1/parent" 
    }, 
    "user": { 
     "href": "http://localhost:8080/api-0.1.0/signUpSheets/1/user" 
    } 
    } 
} 

Siêu! Khá nhiều những gì tôi mong đợi. Bây giờ tôi gọi dịch vụ của tôi bằng cách sử dụng RestTemplate của Spring và đây là nơi tôi bị kẹt. Khi nó marshals trở lại vào đối tượng SignUpSheet nó kéo trong hầu hết các đối tượng, nhưng trường ID là null (có ý nghĩa, bởi vì không có trường ID trong Json, chỉ là một tham chiếu tự) và tất cả đối tượng OneToMany và ManyToOne là null (Tôi giả định cho cùng một lý do).

Câu hỏi của tôi là: Làm thế nào để nói với một trong hai mùa xuân Hateoas để thêm ID vào json hoặc nói với Jackson làm thế nào để sắp xếp nó ID vào trường ID? Hơn nữa làm thế nào để tôi có được các liên kết? Tôi không nên marshaling trở lại thực thể JPA và thay vào đó tạo ra một POJO cho SignUpSheet (một cái gì đó tôi muốn tránh cho mục đích trùng lặp nhưng có thể được nói vào nếu nó là cần thiết/mong muốn cho một số lý do tôi đang thiếu). Tôi có các Jackson2HalModule thêm vào ObjectMapper của tôi nhưng điều đó dường như không có sự khác biệt cho dù đó là có hay không.

@Bean 
@Primary 
public ObjectMapper objectMapper() { 
    ObjectMapper o = new ObjectMapper(); 
    o.registerModule(new Jackson2HalModule()); 
    return o; 
} 

Cảm ơn bạn đã trợ giúp!

============================================== =========

giải pháp:

bước đầu tiên, đọc hướng dẫn :)

Vì vậy, tôi phát hiện ra tôi cần phải mở rộng ResourceSupport trên DTOs đăng mới tạo. Ngay và luôn. Nhưng tôi đã không nhận được liên kết trở lại! Nó có vẻ như tôi cần phải thêm Jackson2HalModule đến đối tượng mapper trên RestTemplate như thế này:

ObjectMapper o = new ObjectMapper(); 
    o.registerModule(new Jackson2HalModule()); 
    MappingJackson2HttpMessageConverter c = new MappingJackson2HttpMessageConverter(); 
    c.setObjectMapper(o); 
    restTemplate.getMessageConverters().add(0, c); 

Vì vậy, tôi tìm tôi sẽ mở rộng ra khỏi RestTemplate và @Component nó và tôi nên được tốt cho bất kỳ HATEOAS nguồn.

Trả lời

3

Tôi không nghĩ rằng bạn cần phải cố gắng để deserialise JSON trở thành thực thể JPA của bạn. Thực thể JPA được gắn chặt với cơ sở dữ liệu của ứng dụng của bạn và cần được coi là một chi tiết triển khai thực hiện của máy chủ. Thay vào đó, tôi khuyên bạn nên ánh xạ tới một kiểu được mô hình hóa cụ thể trên REST API, không phải trên cấu trúc cơ sở dữ liệu của bạn và việc sử dụng JPA của bạn.

Bạn đang sử dụng Spring dữ liệu dạng REST có bao trùm mạnh hypermedia. Điều đó có nghĩa là khách hàng nên sử dụng URI để xác định tài nguyên và liên kết để điều hướng giữa chúng. Ví dụ, ở phía khách hàng, một bảng đăng ký đã có một ID; đó là số href của liên kết self trong phản hồi. Do đó, không cần phải hiển thị ID từ thực thể JPA của bạn. Thật vậy, làm như vậy sẽ làm lộ chi tiết triển khai ứng dụng của bạn mà khách hàng không cần biết.

Thay vì cố gắng để cư tất cả các thuộc tính trong phản ứng, Spring liệu REST cung cấp liên kết để thay thế.Ví dụ: để truy cập vào phụ huynh của trang đăng ký, bạn nên trích xuất số href của liên kết parent từ phản hồi và thực hiện yêu cầu GET trên URI.

+0

Tôi có cảm giác vấn đề của tôi bắt nguồn từ sự hiểu lầm về cách sử dụng Hypermedia. Vì vậy, khi tạo các đối tượng mà tôi muốn soái, làm thế nào để tôi có được các liên kết? Tôi có tạo các biến thành viên bằng cách sử dụng lớp Liên kết không? –

+0

Vâng, nghe có vẻ giống như một cách tiếp cận hợp lý. Bạn có thể sử dụng lại lớp 'Link' của Spring HATEOAS hoặc tạo lớp của riêng bạn. –

Các vấn đề liên quan