2015-04-10 8 views
9

Una cosa che non capisco quando si utilizza ControllerLinkBuilder con methodOn caratteristica è che cosa siete supponiamo di fare quando il controller ha firma del metodo in questo modo:primavera hateoas ControllerLinkBuilder con methodOn

public HttpEntity<ResourceSupport> update(@PathVariable(USER_ID) Long userId, @Valid @RequestBody UserUpdateRequest userUpdateRequest, BindingResult bindingResult) 

Così ogni volta che Desidero utilizzare il metodo , come compilare gli spazi vuoti come UserUpdateRequest argomento e BindingResult (utilizzo il risultato del binding per gestire le eccezioni di richiesta errate con @Controller Advice e JSR 303 per rendere i messaggi di output leggibili dall'uomo).

Quando desidero uso fuori dalla molla di scatola hateoas ControllerLinkBuilder per più facilità con methodOn finisco per scrivere qualcosa di simile (mi dispiace non so se questo non si ritorcerà contro, ma il codice non sembra confortante):

resource.add(linkTo(methodOn(UserController.class).update(userId, null, null)).withSelfRel()); 

Naturalmente posso omettere la methodOn parte e basta usare linkto che poi mi richiede di giocare la costruzione del percorso.

È appropriato passare semplicemente null ref? Inoltre come è conveniente utilizzare methodOn come se si decide di rimuovere diciamo: BindingResult o aggiungere qualcosa di simile HttpServletRequest per la firma del metodo di controllo in modo che la primavera mi poteva passare ulteriori informazioni sulla richiesta se volevo registrare un indirizzo IP per qualche motivo di sicurezza. Ciò richiederebbe di andare a modificare la parte di costruzione del collegamento utilizzando il metodo On.

Un'altra domanda che è po 'mi boggling è dire passo davanti a un arbitro per legittimo methodOn come userUpdateRequest riempito con i dati - non che i dati supponiamo di andare da nessuna parte con il link generato? Ho visto alcuni Hypermedia che includono insieme a rel e href un corpo di ciò che si passa - è possibile con Spring HATEOAS ed è una buona pratica creare collegamenti con payloads pronti per pubblicare/mettere in essi?

Ma tornando alla ControllerLinkBuilder utilizzando solo linkto metodo costruzione di legami con .slash ("...") - è potenzialmente meno manutenzione costosa?

Nella pratica quotidiana cosa consiglieresti e cosa pensi della costruzione di link? Forse qualcuno potrebbe fornire consigli/consigli professionali.

Grazie,

risposta

4

Se un parametro non è necessario per costruire il percorso si può passare tranquillamente null a methodOn. È possibile passare dati "reali" in quanto vengono effettivamente utilizzati solo i dati necessari per costruire il percorso.

methodOn è un'arma a doppio taglio. Da un lato ti risparmia dal costruire manualmente i collegamenti. Quindi non ci saranno errori e se cambierai un percorso tutti i link sarebbero comunque corretti.D'altra parte quasi certamente non cambierai mai un percorso, ma come hai notato, potresti cambiare la firma di un metodo. In tal caso sei costretto ad aggiornare anche il codice di costruzione del link, perché altrimenti non verrà compilato. Non puoi dimenticare l'aggiornamento, quindi è una buona cosa. Eppure, prendere in considerazione la seguente modifica:

update(@ModelAttribute Integer otherId, 
     @PathVariable(USER_ID) Long userId, 
     @Valid @RequestBody UserUpdateRequest) 

methodOn(UserController.class).update(userId, null, null) sarebbe ancora semanticamente corretto, quindi non si ottiene un errore di compilazione. Costruire il collegamento fallirà comunque.

IMHO il modo migliore è fare affidamento sulla costruzione di collegamenti automatizzati il ​​più possibile come è fatto da Spring Data REST. La tua API dovrebbe essere semplice e abbastanza coerente da estrarre almeno la maggior parte del codice di creazione dei collegamenti. Il collegamento verrà quindi creato utilizzando slash(), non methodOn.

Come per includere un corpo: il formato predefinito di Spring HATEOAS è HAL. Utilizza una proprietà _embedded per esporre tali dati.