Structure du service RESTful avec Java Spring pour débutant

12

Je suis relativement nouveau en termes de compétences en développement Web Java. J'ai un projet qui, je pense, ferait un bon candidat pour un service RESTful à partir du peu que je comprends des API. J'essaie d'entrer dans les détails de la façon dont cela est censé être structuré, mais je n'arrive vraiment à rien en termes de recherches Google et de lecture du matériel que j'ai déjà. J'espère que ce post donnera une validation et / ou une redirection en termes de mes 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).
  • Une classe de gestionnaire Java avec des méthodes qui communiquent avec l'ORM pour obtenir les données
  • Une classe / des classes de contrôleur Java qui gère le mappage des demandes et utilise @ResponseBodypour diriger / gérer l'URL et les actions de gestion des données via les verbes HTTP ( http://mysite.com/computers/dell peut être GETdemandé avec le mot "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 être en quelque sorte 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 traiterait les appels AJAX 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 alors, disons, l' ModelAndViewobjet ou quelque chose du genre pour "parler" au contrôleur du service RESTful, obtenir toutes les données transmises , retransmettez 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.

aCarella
la source

Réponses:

19

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é sous forme de guerre (peut être un fichier jar si vous utilisez Spring Boot avec un serveur intégré. Le document Spring Boot explique clairement comment déployer le soi- disant uber jar . C'est extrêmement simple.)
    • Il a des contrôleurs de repos qui gèrent les demandes / réponses
    • dépend du module de service ci-dessous
  • Un service
    • Emballé 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
    • Emballé 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
    • Emballé 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 débats acharnés. 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 à puce 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 sur l'utilisation de JSP, vous devrez introduire une autre guerre (application Web) dotée de contrôleurs et de JSP. Le contrôleur obtiendra les données (normalement au format Json / xml), puis les analysera sur vos modèles (POJO) afin que votre JSP puisse les obtenir de votre contrôleur et faire l'affichage. Publier des données de 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.

Minjun Yu
la source
1
Le domaine est généralement la couche contenant la logique métier. Le domaine est également appelé la couche contenant les services. Les objets de domaine ne sont pas des POJO simples, l'objet de domaine doit contenir une logique métier telle que la validation d'argument et en tant que telle. Il serait probablement préférable de renommer le calque en quelque chose d'autre. La couche référentiel est également assez souvent utilisée pour transférer des données de plusieurs sources vers vos objets de domaine.
Andy
Les modules de service et de référentiel seront-ils également des projets Spring?
Glenn Van Schil
1
@GlennVanSchil Non, il ne doit pas nécessairement s'agir de projets Spring b / c lorsque tout le projet est construit, la couche repo / service sera incluse dans le chemin de classe. Le @Autowirefonctionnera en conséquence.
Minjun Yu
@MinjunYu Merci pour la réponse claire! Mais votre dépôt / service a besoin de ressort comme dépendance maven pour les annotations de service, de référentiel ou de composant, ai-je raison?
Glenn Van Schil
1
@GlennVanSchil Si vous placez toutes les dépendances Spring Maven dans le pom.xml du module parent, il n'est pas nécessaire d'ajouter de dépendances liées à Spring dans les modules enfants (modules repo / service). Ce n'est qu'une façon de mettre en page des projets multi-modules au printemps. Le but est d'organiser votre code. Si votre projet n'est pas si grand et ne changera pas dans un avenir prévisible, vous pouvez combiner le domaine, le repo, le service dans le même module appelé "core". Il semble encore plus propre.
Minjun Yu
2

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 de la page Web. D'après ma lecture de votre question, je pense que vous voulez 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 en les retournant en POJO pour la consommation des JSP.

Je préférerais que la couche de service fasse tout le travail réel, et l'ajout de couches de "présentation" distinctes pour l'application Web (JSP) et le contrôleur REST. Il s'agirait de contrôleurs distincts, dans lesquels le service serait injecté. Alternativement, 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 boutique Java implémenterait votre projet serait de faire des versions régulières de la couche 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 fonctionne certainement pour nous. Nous aurions 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 build et de dépendance. 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.

kiwiron
la source