pierwsze pytanie tutaj, więc bądź łagodny :)Wiosenny serwis do bootowania, jak go zmotoryzować linki jako właściwości?
Mam projekt JPA, który chcę wystawić jako REST. Robiłem to tak daleko:
Moje podmiot:
@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
}
wszystko dobrze, wzywam dodaną wiosna-Boot-starter-data-resztę mojego pom i teraz otrzymuję usługę. Oto JSON, który otrzymuję.
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"
}
}
}
Super! Prawie czego się spodziewałem. Teraz nazywam się moją usługą za pomocą Spring's RestTemplate i tutaj utknąłem. Kiedy Marszałków powrotem do SignUpSheet obiekt to ciągnie w większości obiektów, ale pole ID jest null (co ma sens, ponieważ nie ma pola ID w JSON, tylko odniesienie self) i cały obiekt OneToMany i ManyToOne są null (zakładam z tego samego powodu).
Moje pytanie brzmi: Jak mogę powiedzieć albo Wiosna hateoas dodać identyfikator do json lub powiedzieć Jackson jak zebrać jej identyfikator w polu identyfikatora? Ponadto w jaki sposób mogę uzyskać linki? Czy nie powinienem wracać do jednostki JPA, a zamiast tego utworzyć kolejne POJO dla SignUpSheet (coś, czego chciałbym uniknąć dla celów powielania, ale można by mówić do niego, jeśli jest to konieczne/pożądane z jakiegoś powodu, którego mi brakuje). Mam Jackson2HalModule dodany do mojej ObjectMapper, ale wydaje się, że nie ma różnicy, czy jest tam, czy nie.
@Bean
@Primary
public ObjectMapper objectMapper() {
ObjectMapper o = new ObjectMapper();
o.registerModule(new Jackson2HalModule());
return o;
}
Z góry dziękujemy za pomoc!
============================================== =========
Rozwiązanie:
Pierwszy krok, przeczytaj instrukcję :)
więc znalazłem się muszę przedłużyć ResourceSupport nowo utworzonych DTOs. Gotowe i gotowe. Ale nie odzyskałem żadnych linków! Wydaje się, że muszę dodać Jackson2HalModule do obiektu odwzorowującym na RestTemplate tak:
ObjectMapper o = new ObjectMapper();
o.registerModule(new Jackson2HalModule());
MappingJackson2HttpMessageConverter c = new MappingJackson2HttpMessageConverter();
c.setObjectMapper(o);
restTemplate.getMessageConverters().add(0, c);
więc postać będę rozciągają się od RestTemplate i @Component go i powinno być dobre dla każdego hateoas ratunek.
Mam przeczucie, że mój problem wynika z nieporozumienia na temat korzystania z hipermedii. A więc kiedy tworzę obiekty, w których chcę sterroryzować, w jaki sposób mogę uzyskać linki? Czy mogę utworzyć zmienne członkowskie za pomocą klasy Link? –
Tak, to brzmi jak rozsądne podejście. Możesz ponownie użyć klasy "Link" Spring HATEOAS lub utworzyć własną. –