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
Via @RestController
dans un contrôleur
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.
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.
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 .
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
@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
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.