web-dev-qa-db-fra.com

Structure du service RESTful avec Java Spring pour débutant

Je suis relativement nouveau en termes de Java compétences en développement Web. J'ai un projet qui, je pense, ferait un bon candidat pour un service RESTful d'après le peu que je comprends des API. J'essaie de entrer dans les détails de la façon dont cela est censé être structuré, mais sans vraiment aller nulle part en termes de recherches Google et de lecture du matériel que j'ai déjà. J'espère que ce message donnera une validation et/ou une redirection en termes de mon connaissances et hypothèses sur ce sujet.

Mon hypothèse actuelle est que mon service RESTful aura la structure suivante:

  • Données de base de données (SQL).
  • Un ORM (j'utilise un ORM relativement impopulaire appelé CPO, mais cela serait juste remplacé par Hibernate avec la plupart des gens).
  • A Java classe de gestionnaire avec des méthodes qui parlent à l'ORM pour obtenir les données
  • A Java classe/classes de contrôleur qui gère le mappage des demandes et utilise @ResponseBody pour diriger/gérer l'URL et les actions sur la façon dont les données sont gérées via les verbes HTTP ( http://mysite.com/computers/Dell peut être GET demande avec Word "Dell" dans l'URL étant un paramètre qui renverra un tableau JSON d'informations sur les ordinateurs Dell).
  • Ce service doit être effectué avec Spring Boot, ou en quelque sorte être autonome et indépendant de toute autre application.

En supposant maintenant que ce qui précède est correct, j'aurais (à un niveau très basique) un service RESTful que toute application peut utiliser pour consommer et utiliser des données.

Alors disons que j'ai ensuite mon application web. Supposons que je crée une application Web sur les informations sur le matériel informatique et que j'utilise Spring pour créer cette application Web. Voici mes hypothèses:

  • J'aurais un tas de vues en tant que JSP, avec les JSP ayant des inclusions HTML, CSS et JavaScript. Le JavaScript gérerait AJAX appels au contrôleur de cette application selon les besoins (ci-dessous).
  • Cette application Web aurait également son propre contrôleur pour gérer les demandes d'URL et le routage de l'application, et le contrôleur utiliserait, par exemple, l'objet ModelAndView ou quelque chose du genre pour "parler" au contrôleur du service RESTful, obtenir les données transmises, retransmettre ces données à la vue (Javascript, JSP, etc ...) pour les afficher.

Suis-je sur la bonne voie, ici? Je comprends qu'il existe également un aspect d'authentification dans les services RESTful, mais je n'y suis pas encore conceptuellement (et mon projet va être utilisé dans un réseau privé, la sécurité n'est donc pas une priorité à ce stade).

Toute perspicacité, critique, connaissance, rétroaction ou clarification est grandement appréciée.

12
aCarella

Voici l'un de mes exemples préférés de structure pour votre application de repos de printemps.

1. Séparation des couches, chaque couche est un module/projet individuel

  • API REST
    • Emballé comme war (Peut être jar si vous utilisez Spring Boot avec serveur intégré. Spring Boot Doc explique clairement comment déployer le soi-disant uber jar . C'est mortellement simple.)
    • Il a des contrôleurs de repos qui gèrent les demandes/réponses
    • dépend de Service Module ci-dessous
  • Service
    • Conditionné en pot
    • Abstractions de logique métier, cette couche ne sait pas comment communiquer avec la source de données.
    • Il sera câblé automatiquement dans les contrôleurs de repos
    • Dépend du module DAO/Repository ci-dessous
  • DAO/Repository
    • Conditionné en pot
    • Parle directement à la source de données, a des opérations communément appelées CRUD. Il peut s'agir d'un simple accès jdbc, JPA ou même d'un fichier.
    • Dépend du module de domaine ci-dessous
  • Domaine
    • Conditionné en pot
    • Il a vos modèles de domaine, normalement des classes POJO. Si vous utilisez ORM, ce sont des entités ORM.
    • Il pourrait également s'agir de DTO (Data Transfer Object), qui font toujours l'objet de vifs débats. Utilisez-le ou non est votre appel.
  • Vous pouvez ajouter plus de modules tels que l'utilitaire, l'intégration de tiers, etc. mais les éléments ci-dessus sont fortement recommandés.

2. Build/Dependency Management Tools (IMHO très nécessaire)

Il y en a beaucoup, la recherche Google vous le montrera. Personnellement, j'aime Maven avec Spring. Cela fonctionne simplement pour la structure de projet ci-dessus.
Notez également que si vous utilisez maven, il existe un module parent qui regroupe tous les modules décrits dans la section 1. Tous les modules à puces correspondent également aux modules maven.

3. Réflexions sur votre projet particulier

Puisque vous utilisez REST, je vous recommande fortement de ne PAS utiliser JSP comme vue. Vous pouvez utiliser le HTML5 + Javascript ordinaire ou un cadre populaire comme AngularJS comme vue.
Si vous insistez pour utiliser JSP, vous devrez introduire une autre guerre (application web) qui a des contrôleurs et des JSP. Le contrôleur obtiendra les données (normalement au format Json/xml), puis les analysera dans vos modèles (POJO) afin que votre JSP puisse les obtenir de votre contrôleur et faire l'affichage. Publier des données depuis JSP est l'inverse, j'ai omis ici.

Il est loin d'être un guide complet car ce sujet est assez vaste et dépend fortement de vos besoins spécifiques, mais les termes inclus ici vous suffisent pour faire des recherches supplémentaires (Google, c'est le cas). J'espère que cela vous donnera quelques idées sur la façon d'aborder.

19
Minjun Yu

Tout en étant d'accord avec la plupart des réponses de @ Minjun.Y, je pense que j'opterais pour une approche légèrement différente de la couche REST et page Web. D'après ma lecture de votre question, je pense que vous veulent exposer à la fois une interface Web et une interface REST au monde extérieur. Il y a peu à gagner en lisant les POJO de la base de données, en transformant les données en JSON, puis de nouveau en POJO pour consommation des JSP.

Je préférerais que la couche de service fasse tout le travail réel et en ajoutant des couches de "présentation" distinctes pour l'application Web (JSP) et le contrôleur REST. Ce sont des contrôleurs séparés, dans lesquels le Sinon, optez pour un service REST et créez toute la logique de présentation côté client comme indiqué dans la réponse précédente.

De plus, je ne suis pas un grand fan des modules Maven. La façon dont notre Java implémenterait votre projet serait de créer des versions régulières de la couche de service, puis de rendre les couches de présentation dépendantes de la dernière version. Il y a de la place pour une discussion à ce sujet, mais cela Nous aurions certainement l'interface Web et les interfaces REST en tant que projets Maven distincts, car ils vivent normalement dans des fichiers .war différents et nécessitent donc un déploiement séparé.

BTW, je renforcerais la nécessité de se familiariser avec les outils de gestion de la construction et des dépendances. Une fois que votre projet atteint une taille raisonnable, vous en avez besoin. Des outils gratuits comme Maven, Jenkins et Nexus rendent la gestion des versions moins problématique.

2
kiwiron