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.
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? –
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. –