web-dev-qa-db-fra.com

Quand utiliser @RestController vs @RepositoryRestResource

J'ai examiné divers exemples d'utilisation de Spring avec RESTE . Notre objectif final est un printemps HATEOAS/HAL installer

J'ai vu deux méthodes distinctes pour rendre (~ ~ ~ ~] reste [~ # ~] dans Spring

  1. Via @RestController dans un contrôleur

  2. Via @RepositoryRestResource dans un référentiel

Ce que j'ai du mal à trouver, c'est pourquoi vous utiliseriez l'une sur l'autre. Lorsque vous essayez d'implémenter HAL quel est le meilleur?

Notre base de données est Neo4j.

74
code

Ok, alors la nouvelle est que vous voulez utiliser le @RepositoryRestResource puisque cela crée un service [~ # ~] hateoas [~ # ~] avec Spring JPA .

Comme vous pouvez le voir ici , en ajoutant cette annotation et en la liant à votre Pojo, vous avez un système entièrement fonctionnel [~ # ~] hateoas [~ # ~] service sans avoir à implémenter la méthode de référentiel ou les méthodes de service REST

Si vous ajoutez le @RestController vous devez ensuite implémenter chaque méthode que vous souhaitez exposer vous-même et elle n’exporte pas non plus cette méthode vers un [~ # ~] hateoas [~ # ~] format.

51
zpontikas

Il existe une troisième (et quatrième) option que vous n'avez pas définie, qui consiste à utiliser @BasePathAwareController ou @RepositoryRestController, selon que vous exécutez ou non des actions spécifiques à l'entité.

@RepositoryRestResource est utilisé pour définir les options de l'interface de référentiel public. Il créera automatiquement les points de terminaison en fonction du type de référentiel en cours d'extension (par exemple, CrudRepository/PagingAndSortingRepository/etc.).

@BasePathAwareController et @RepositoryRestController sont utilisés lorsque vous souhaitez créer manuellement des points de terminaison, mais que vous souhaitez utiliser les configurations Spring Data REST que vous avez configurées).

Si vous utilisez @RestController, vous créerez un ensemble parallèle de noeuds finaux avec différentes options de configuration - c.-à-d. Un convertisseur de message différent, des gestionnaires d'erreur différents, etc. ils vont volontiers coexister (et probablement causer de la confusion).

Une documentation spécifique peut être trouvée ici .

32
Jacob Creed

Eh bien, les réponses ci-dessus sont correctes dans leur contexte mais je vous donne un exemple concret.

Dans de nombreux scénarios, en tant qu'élément de l'API, nous devons fournir des points de terminaison pour la recherche d'une entité sur la base de certains critères. Maintenant, en utilisant JPA, vous n’avez même pas besoin d’écrire des requêtes, créez simplement une interface et des méthodes avec la nomenclature spécifique de Spring-JPA. Pour exposer ces API, vous allez créer une couche de service qui appellera simplement ces méthodes de référentiel et enfin des contrôleurs qui exposeront les points de terminaison en appelant la couche de service.

Ce que Spring a fait ici, vous permet d’exposer ces noeuds finaux à partir de telles interfaces (référentiels) qui sont généralement des appels GET pour rechercher une entité et en arrière-plan génère les fichiers nécessaires à la création des noeuds finaux. Donc, si vous utilisez @RepositoryRestResource, il n’est pas nécessaire de créer une couche Service/Contrôleur.

D'autre part, @RestController est un contrôleur qui traite spécifiquement des données JSON et du travail de repos en tant que contrôleur. En bref @Controller + @ResponseBody = @RestController.

J'espère que cela t'aides.

Voir mon exemple de travail et blog pour les mêmes:
http://sv-technical.blogspot.com/2015/11/spring-boot-and-repositoryrestresource.html
https://github.com/svermaji/Spring-boot-with-hibernate-no-controller

15
shaILU

@RepositoryRestController Remplace les données Spring générées par défaut REST des contrôleurs du référentiel exposé.

Pour tirer parti des paramètres Spring Data REST, des convertisseurs de message, de la gestion des exceptions, etc., utilisez l'annotation @RepositoryRestController Au lieu d'un Spring MVC standard @Controller Ou @RestController

Par exemple, ces contrôleurs utilisent le paramètre spring.data.rest.basePath Spring Boot comme chemin de base pour le routage.

Voir Remplacement des données de ressort REST Gestionnaires de réponse) .

Soyez conscient de l'ajout de @ResponseBody Car il manque dans @RepositoryRestController

Si vous n'avez pas exposé le référentiel (marqué comme @RepositoryRestResource(exported = false)), utilisez plutôt l'annotation @BasePathAwareController

Également être au courant des sacs

ControllerLinkBuilder ne prend pas en compte le chemin de base de Spring Data REST et @RequestMapping ne doit pas être utilisé au niveau classe/type

et

Le chemin de base n'apparaît pas dans HAL

Solution de contournement pour corriger le lien: https://stackoverflow.com/a/51736503/54847

UPDATE: enfin, je préfère ne pas utiliser @RepositoryRestController À cause de nombreuses solutions de contournement.

6
GKislin