2017-10-05 16 views
1

J'ai un projet avec Spring Boot 1.5.7, Spring Data REST, Hibernate, Spring JPA, Swagger2.Personnaliser les points de terminaison avec Spring Data REST

J'ai deux haricots comme ceux-ci:

@Entity 
public class TicketBundle extends AbstractEntity { 
    private static final long serialVersionUID = 404514926837058071L; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    private List<Note> notes = new ArrayList<>(); 

    ..... 
    } 

et

@Entity 
public class Note extends AbstractEntity { 
    private static final long serialVersionUID = -5062313842902549565L; 

    @Lob 
    private String text; 
    ... 
    } 

J'expose mes méthodes par dépôt:

@Transactional 
@RepositoryRestResource(excerptProjection = TicketBundleProjection.class) 
@PreAuthorize("isAuthenticated()") 
public interface TicketBundleRepository extends PagingAndSortingRepository<TicketBundle, Long> { 
.... 
} 

donc dans fanfaronnades je vois le point final dans lequel je suis intéressé qui est nécessaire pour charger la collection de notes d'un ensemble de billets spécifique:

enter image description here

Maintenant, je veux remplacer la valeur par défaut GET /api/v1/ticketBundles/{id}/notes et le remplacer par ma méthode personnalisée que je mets dans TicketBundleRepository:

@Transactional(readOnly = true) 
@RestResource(rel = "ticketBundleNotes", path = "/ticketBundles/{id}/notes") 
@RequestMapping(method = RequestMethod.GET, path = "/ticketBundles/{id}/notes") 
@Query("SELECT n FROM TicketBundle tb JOIN tb.notes n WHERE tb.id=:id ORDER BY n.createdDate DESC,n.id DESC") 
public Page<Note> getNotes(@Param("id") long id, Pageable pageable); 

Il est très pratique de créer la requête de cette façon parce que je dois utilisez Pageable et renvoyez une page. Malheureusement, j'ai deux problèmes à ce stade.

Premier problème La méthode est mappée sur le point de terminaison /api/v1/ticketBundles/search/ticketBundles/{id}/notes instad de /api/v1/ticketBundles/ticketBundles/{id}/notes enter image description here

Deuxième problème Quand j'appelle la méthode de fanfaronnades que je reçois une erreur HTTP 404:

La demande semble faux. Semble la variable de chemin ne soit pas compris:

curl -X GET --header 'Accept: application/json' 'http://localhost:8080/api/v1/ticketBundles/search/ticketBundles/{id}/notes?id=1' 

Ceci est la réponse du serveur:

{ 
    "timestamp": "2017-10-05T14:00:35.563+0000", 
    "status": 404, 
    "error": "Not Found", 
    "message": "No message available", 
    "path": "/api/v1/ticketBundles/search/ticketBundles/%7Bid%7D/notes" 
} 

sans aucune erreur sur le côté serveur.

Existe-t-il un moyen de remplacer le point de terminaison GET/api/v1/ticketBundles/{id}/notes en l'exposant à Repository sans utiliser un contrôleur personnalisé (en utilisant que je perds les fonctionnalités pour gérer le Pageable)?

En outre, qu'est-ce que je fais de mal pour obtenir un HTTP 404 dans l'appel que j'ai montré ci-dessus?

Répondre

0

Je crois que vous utilisez des annotations incorrectes. Vous auriez besoin d'annoter votre classe avec @RestController et d'utiliser @PathVariable sur votre méthode au lieu de @Param. Voici un exemple de travail, vous pouvez l'adapter en fonction de vos besoins.

@org.springframework.data.rest.webmvc.RepositoryRestController 
@org.springframework.web.bind.annotation.RestController 
public interface PersonRepository extends org.springframework.data.repository.PagingAndSortingRepository<Person, Long> { 

    @org.springframework.web.bind.annotation.GetMapping(path = "/people/{id}") 
    Person findById(@org.springframework.web.bind.annotation.PathVariable("id") Long id); 

} 
+0

Merci pour votre réponse. Malheureusement, d'après ce https://jira.spring.io/browse/DATAREST-1154, il n'est pas possible d'utiliser @PathVariable dans un RestRepository. J'ai essayé votre exemple et ne fonctionne pas pour moi. J'utilise Spring Data REST. Merci! – drenda