2015-07-24 3 views
15

Sono nuovo per l'avvio Spring. Stavo cercando di creare un servizio web RESTful che si collegasse anche a MongoDB. Tutto funziona come spiega la guida ad eccezione di questo.Utilizzo dell'annotazione RepositoryRestResource per modificare l'endpoint REST non funzionante

package hello.requests; 

import java.util.List; 
import org.springframework.data.mongodb.repository.MongoRepository; 
import org.springframework.data.repository.query.Param; 
import org.springframework.data.rest.core.annotation.RepositoryRestResource; 

import hello.models.CustomerModel; 

@RepositoryRestResource(collectionResourceRel = "people", path = "people") 
public interface CustomerRepository extends MongoRepository<CustomerModel, String> { 

    List<CustomerModel> findByLastName(@Param("name") String name); 

} 

Qui io sto cercando di modificare l'endpoint RESTful per il repository dal default /customerModels a /people. Ma quando eseguo questo, ottengo 404 se provo /people ma funziona bene per /customerModels. In un senso più ampio, come funziona @RepositoryRestResource? Cosa sto facendo di sbagliato qui?

+0

è possibile condividere le configurazioni? –

+0

Puoi elaborare? Questo è più o meno basato su questa guida di primavera. https://spring.io/guides/gs/accessing-mongodb-data-rest/ – Codevalley

+0

hai controllato la "gente" della tua collezione mongodb? Btw puoi condividere i tuoi registri su di esso se c'è qualche eccezione quando hai 404. –

risposta

4

Senza vedere la tua intera configurazione è difficile sapere esattamente cosa sta succedendo nella vostra situazione. Tuttavia utilizzando le più recenti guida a https://github.com/spring-guides/gs-accessing-data-mongodb.git sono in grado di farlo funzionare apportando le seguenti modifiche:

  • Aggiunta primavera-boot-starter-dati-rest come dipendenza nel file POM.

    <dependency> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-data-rest</artifactId> 
    </dependency> 
    
  • Aggiunta di questa annotazione alla classe CustomerRepository.

    @RepositoryRestResource(path = "people") 
    
  • Impostazione di getter e setter nella classe Customer per i campi 2 nome del costruttore per evitare un errore di serializzazione Jackson.

Usando questo quando faccio funzionare l'applicazione sono in grado di accedere al repository in http://localhost:8080/people. Se rimuovo l'annotazione, si accede a CustomerRepository allo http://localhost:8080/customers. Fammi sapere se vuoi che pubblichi un fork su GitHub.

Per rispondere alla domanda su quale RepositoryRestResource è che sovrascrive gli attributi per lo ResourceMapping che viene creato per impostazione predefinita. Gli attributi sono utilizzati nella creazione del mapping e modificano i relativi valori di ritorno dei metodi sulla classe di mappatura. Per impostazione predefinita, Spring Data Rest crea i valori predefiniti in base ai nomi delle classi degli oggetti utilizzati nella definizione del repository.

3

/customerModels viene generato in base all'impostazione predefinita perché il metodo predefinito restituisce un elenco di CustomerModel. Quindi puoi provare ad aggiungere questo @RestResource(path = "names") al tuo metodo e quindi accedervi come: http://localhost:8080/yourapp/people/search/names. Guardate qui: Spring data docs

3

Non è possibile utilizzare barra all'interno dell'attributo path, ma è possibile impostare il percorso base in application.properties:

# DATA REST (RepositoryRestProperties) 
spring.data.rest.base-path=/my/base/uri 
# Base path to be used by Spring Data REST to expose repository resources. 
+1

Questo ha funzionato per me ma è il percorso di base non base-uri – dough

+0

hai ragione, l'ho corretto, grazie – wildloop