6

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.

Odpowiedz

3

Nie sądzę, należy próbować deserialise JSON z powrotem do jednostki JPA. Jednostka JPA jest bardzo ściśle powiązana z bazą danych aplikacji i powinna być traktowana jako szczegół implementacji serwera. Zamiast tego polecam mapowanie do typu, który jest konkretnie wzorowany na interfejsie API REST, a nie na strukturze bazy danych i używaniu WZP.

Używasz Wiosna danych odpoczynku, który silnie ogarnia hipermedia. Oznacza to, że klienci powinni używać identyfikatorów URI do identyfikowania zasobów i łączy do nawigacji między nimi. Na przykład po stronie klienta arkusz rejestracji ma już identyfikator; jest to href łącza self w odpowiedzi. Dlatego nie musisz ujawniać identyfikatora z jednostki JPA. W rzeczywistości spowoduje to ujawnienie szczegółów implementacji aplikacji, o których klienci nie muszą wiedzieć.

Zamiast starać się wypełnić wszystkie właściwości w odpowiedzi Wiosna danych REST zawiera linki zamiast.Na przykład, aby uzyskać dostęp do elementu nadrzędnego arkusza rejestracji, należy wyodrębnić z odpowiedzi odpowiedź href z linku parent i wykonać żądanie na URI w postaci GET.

+0

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

+0

Tak, to brzmi jak rozsądne podejście. Możesz ponownie użyć klasy "Link" Spring HATEOAS lub utworzyć własną. –