2015-05-22 14 views
8

Sto sviluppando un'applicazione CRUD basata su componenti che utilizza Spring Data JPA e Spring Data REST. Ho diversi componenti. Ad esempio il sistema componente ha il modello User e UserRepository. I componenti sono differenziati in base al nome del pacchetto. come com.example.app.<component_name>Come personalizzare Spring Data REST per utilizzare un percorso multi-segmento per una risorsa repository?

Quindi, per rendere il mio API REST look più pulito, ho bisogno di implementare l'URL API come di seguito.

host:8080/<component_name>/<model_collection_name>

ad esempio

host:8080/system/users

ho il seguente nel mio repository

@RepositoryRestResource(collectionResourceRel = "users", path = "system/users") 
public interface UserRepository extends PagingAndSortingRepository<User, Long> { 
    ... 
} 

questo genera il seguente, quando ho goto http://localhost:8080

{ 
    "_links": { 
    "users": { 
    "href": "http://localhost:8080/system/users{?page,size,sort}", 
    "templated": true 
}, 
... 

Ma quando ho goto http://localhost:8080/system/users

dà un errore

ven 22 mag 17:56:37 IST 2015 Si è verificato un errore imprevisto (type = Non Trovato, status = 404). Nessuna informazione disponibile

NOTA: Se io mappato il percorso system-users allora funziona bene, ma quando uso un / nel percorso, come system/users, si rompe e dà l'errore.

risposta

10

tl; dr

Non supportato.

dettagli

In generale: non si concentrano sulla progettazione di URL. La struttura di un URI non deve importare a un client REST per definizione:

In nessun momento alcun fanno il server o software client bisogno di sapere o capire il significato di un URI - non fanno che agiscono come un canale attraverso il che il creatore di una risorsa (un'autorità di denominazione umana) può associare rappresentazioni con la semantica identificata dall'URI.

(da Roy Fielding - stili architettonici e la progettazione di architetture basate su software di rete - Section 6.2.4)

Se si segue che i criteri, si prende cura di scegliere i nomi di relazioni, progettare le rappresentazioni per le risorse esponi ecc.

Detto questo, quello che stai cercando non è attualmente supportato. Se ritieni che valga la pena aggiungere questa funzione (penso che non lo sia, a causa dell'argomento sopra riportato), sentiti libero di aprire un ticket nel nostro bug tracker.

Probabilmente è piuttosto complicato da implementare a causa del modo in cui funziona la mappatura di Spring MVC e soprattutto la combinazione di mappatura di segmenti di percorso singolari e non singolari potrebbe causare alcune ambiguità. Tutto ciò rende piuttosto improbabile che questa richiesta venga seguita.

+0

L'argomento sembra valido, ma ciò non risolve il problema. Sto facendo uno studio di fattibilità tecnica sullo sviluppo di un'enorme applicazione ERP multi-componente. Comunque grazie per il tempo e lo sforzo che ci hai messo per rispondere a questa domanda. Se possibile, ti preghiamo di prendere in considerazione questo problema nelle versioni future, in quanto potrebbe aiutare gli altri come me. Ho creato un problema in Jira https://jira.spring.io/browse/DATAREST-555 –

+1

In tal caso, Spring Data Rest non è adatto per il controllo delle versioni API? – IllSc

+0

@IllSc è possibile eseguire la versione della propria API modificando il percorso di base tramite la proprietà spring.data.rest.base-path in application.properties. –

1

Penso che questa (o una domanda simile) abbia già risposto here su stackoverflow.

Impostare l'URI di base utilizzando una classe RepositoryRestMvcConfiguration personalizzato.

+1

Grazie per la risposta. Ma non è l'URL di base che sto cercando di cambiare qui. Posso farlo semplicemente aggiungendo un 'spring.data.rest.baseUri = api' al mio file' application.properties' in spring-boot. Ho bisogno di avere delle barre nel percorso che sto cercando di esporre come link del resto. –

+0

O c'è un modo per avere più uris base per i dati di resto per ogni mio componente. –

+0

quindi il tuo obiettivo è fornire due endpoint riposanti (componente A e B, come "sistema") e ognuno di essi può avere diversi repository (repA1, repA2, ..., come "utenti") sotto ..? http: // localhost: 8080/A/repA1 http: // localhost: 8080/A/repA2 http: // localhost: 8080/B/repB1 Esiste una componente stesso contiene alcuna logica o è solo un modo di strutturare la tua applicazione? –