Struktur des RESTful Service mit Java Spring für Anfänger

12

Ich bin relativ neu in Bezug auf Java-Webentwicklungsfähigkeiten. Ich habe ein Projekt, von dem ich denke, dass es ein guter Kandidat für einen RESTful-Service wäre, wenn ich nur wenig über APIs verstehe. Ich versuche, mich mit den Details zu befassen, wie dies strukturiert sein soll, komme aber in Bezug auf die Google-Suche und das Lesen des Materials, das ich bereits habe, nicht wirklich weiter. Ich hoffe, dass dieser Beitrag eine gewisse Validierung und / oder Umleitung in Bezug auf mein Wissen und meine Annahmen zu diesem Thema liefert.

Ich gehe derzeit davon aus, dass mein RESTful-Service die folgende Struktur aufweist:

  • Datenbankdaten (SQL).
  • Ein ORM (ich verwende ein relativ unbeliebtes ORM namens CPO, das jedoch bei den meisten Menschen nur durch den Ruhezustand ersetzt wird).
  • Eine Java-Manager-Klasse mit Methoden, die mit dem ORM kommunizieren, um die Daten abzurufen
  • Eine oder mehrere Java-Controller-Klassen, die die Anforderungszuordnung verarbeiten und @ResponseBodydie URL und Aktionen für den Umgang mit Daten über HTTP-Verben steuern / verarbeiten ( http://mysite.com/computers/dell), werden möglicherweise GETmit dem Wort "dell" angefordert. in der URL als Parameter, der ein JSON-Array mit Informationen zu Dell-Computern zurückgibt).
  • Dieser Dienst sollte mit Spring Boot ausgeführt werden oder in der Lage sein, eigenständig und unabhängig von anderen Anwendungen zu sein.

Unter der Annahme, dass das oben Gesagte korrekt ist, hätte ich (auf einer sehr einfachen Ebene) einen RESTful-Service, mit dem jede Anwendung Daten konsumieren und verwenden kann.

Sagen wir also, ich habe dann meine Webanwendung. Angenommen, ich erstelle eine Web-App mit Informationen zur Computerhardware und verwende Spring, um diese Web-App zu erstellen. Hier sind meine Annahmen:

  • Ich hätte eine Reihe von Ansichten als JSPs, wobei die JSPs HTML-, CSS- und JavaScript-Includes enthalten. Das JavaScript verarbeitet AJAX-Aufrufe an den Controller dieser Anwendung nach Bedarf (siehe unten).
  • Diese Web-App verfügt auch über einen eigenen Controller, der die URL-Anforderungen und das Routing der App verarbeitet, und der Controller verwendet dann beispielsweise das ModelAndViewObjekt oder etwas in dieser Richtung, um mit dem Controller des RESTful-Dienstes zu "sprechen" und die übertragenen Daten abzurufen Übergeben Sie diese Daten zur Anzeige an die Ansicht (Javascript, JSP usw.) zurück.

Bin ich hier auf dem richtigen Weg? Ich verstehe, dass RESTful-Services auch einen Authentifizierungsaspekt haben, aber konzeptionell bin ich noch nicht da (und mein Projekt wird in einem privaten Netzwerk verwendet, sodass Sicherheit derzeit keine Priorität hat).

Jeder Einblick, jede Kritik, jedes Wissen, jedes Feedback oder jede Klarstellung wird sehr geschätzt.

aCarella
quelle

Antworten:

19

Hier ist eines meiner Lieblingsbeispiele für die Struktur Ihrer Spring Rest App.

1. Trennung von Ebenen, jede Ebene ist ein einzelnes Modul / Projekt

  • REST-API
    • Als Krieg verpackt (Könnte jar sein, wenn Sie Spring Boot mit eingebettetem Server verwenden. Das Spring Boot-Dokument erklärt klar, wie das sogenannte Uber-Jar bereitgestellt wird . Es ist tödlich einfach.)
    • Es verfügt über Rest-Controller, die Anforderungen / Antworten verarbeiten
    • hängt vom unten stehenden Servicemodul ab
  • Bedienung
    • Als Glas verpackt
    • Diese Logikschicht hat keine Ahnung, wie sie mit der Datenquelle kommunizieren soll.
    • Es wird in Rest-Controllern automatisch verdrahtet
    • Hängt vom DAO / Repository- Modul unten ab
  • DAO / Repository
    • Als Glas verpackt
    • Spricht direkt mit der Datenquelle und hat Operationen, die allgemein als CRUD bekannt sind. Es kann sich um einfachen JDBC-, JPA- oder sogar Dateizugriff handeln.
    • Hängt vom unten stehenden Domain- Modul ab
  • Domain
    • Als Glas verpackt
    • Es hat Ihre Domain-Modelle, normalerweise POJO-Klassen. Wenn Sie ORM verwenden, handelt es sich um ORM-Entitäten.
    • Es könnte auch DTO (Data Transfer Object) geben, über das noch immer heiß diskutiert wird. Verwenden Sie es oder nicht ist Ihr Anruf.
  • Sie können weitere Module hinzufügen, z. B. Dienstprogramm, Integration von Drittanbietern usw. Die oben genannten Module werden jedoch dringend empfohlen.

2. Build / Dependency Management Tools (IMHO sehr notwendig)

Es gibt viele davon, Google Search wird es Ihnen zeigen. Ich persönlich mag Maven mit Frühling. Es funktioniert einfach für die obige Projektstruktur.
Beachten Sie auch, dass es bei Verwendung von Maven ein übergeordnetes Modul gibt, das alle in Abschnitt 1 beschriebenen Module zusammenfasst. Alle Aufzählungspunktmodule entsprechen auch Maven-Modulen.

3. Gedanken zu Ihrem speziellen Projekt

Da Sie REST verwenden, würde ich dringend empfehlen, JSP NICHT als Ansicht zu verwenden. Sie können einfaches HTML5 + Javascript oder ein beliebtes Framework wie AngularJS als Ihre Ansicht verwenden.
Wenn Sie darauf bestehen, JSP zu verwenden, müssen Sie einen weiteren Krieg (Web-App) einführen , der Controller und JSPs enthält. Der Controller erhält die Daten (normalerweise Json / XML-Format) und analysiert sie dann in Ihre Modelle (POJO), damit Ihre JSP sie von Ihrem Controller abrufen und die Anzeige durchführen kann. Das Posten von Daten aus JSP ist umgekehrt, ich habe hier weggelassen.

Es ist bei weitem kein vollständiger Leitfaden, da dieses Thema sehr umfangreich ist und stark von Ihren spezifischen Anforderungen abhängt. Die hier enthaltenen Begriffe reichen jedoch aus, um zusätzliche Nachforschungen anzustellen (Google ist es). Hoffentlich gibt Ihnen dies einige Ideen, wie Sie vorgehen sollen.

Minjun Yu
quelle
1
Domäne ist normalerweise die Schicht, die Geschäftslogik enthält. Die Domäne wird normalerweise auch als Schicht mit Diensten bezeichnet. Domänenobjekte sind keine einfachen POJOs. Das Domänenobjekt sollte Geschäftslogik wie die Argumentvalidierung und als solche enthalten. Es wäre wahrscheinlich besser, die Ebene in etwas anderes umzubenennen. Die Repository-Schicht wird auch häufig verwendet, um Daten aus mehreren Quellen auf Ihre Domänenobjekte zu übertragen.
Andy
Werden die Service- und Repository-Module auch Spring-Projekte sein?
Glenn Van Schil
1
@GlennVanSchil Nein, es müssen keine Spring-Projekte sein, wenn das gesamte Projekt erstellt wird. Die Repo / Service-Schicht wird in den Klassenpfad aufgenommen. Das @Autowirewird als Ergebnis funktionieren.
Minjun Yu
@ MinjunYu Danke für die klare Antwort! Aber Ihr Repo / Service benötigt Spring als Maven-Abhängigkeit für die Service-, Repository- oder Component-Annotationen, stimmt's?
Glenn Van Schil
1
@GlennVanSchil Wenn Sie alle Spring Maven-Abhängigkeiten in die pom.xml des übergeordneten Moduls einfügen, müssen in untergeordneten Modulen (Repo- / Servicemodule) keine federbezogenen Abhängigkeiten hinzugefügt werden. Dies ist nur eine Möglichkeit, Projekte mit mehreren Modulen im Frühjahr zu gestalten. Der Zweck ist, Ihren Code zu organisieren. Wenn Ihr Projekt nicht so groß ist und sich in absehbarer Zeit nicht ändern wird, können Sie die Domain, das Repo und den Service in demselben Modul namens "Core" kombinieren. Es sieht noch sauberer aus.
Minjun Yu
2

Obwohl ich den meisten Antworten von @ Minjun.Y zustimme, denke ich, dass ich einen etwas anderen Ansatz für die REST- und Webseitenebene wählen würde. Nach dem Lesen Ihrer Frage denke ich, dass Sie sowohl eine Webschnittstelle als auch eine REST-Schnittstelle der Außenwelt zugänglich machen möchten. Es gibt wenig zu gewinnen, wenn POJOs aus der Datenbank gelesen, die Daten in JSON und dann wieder in POJOs für den Verbrauch durch JSPs umgewandelt werden.

Ich würde es vorziehen, die Service-Schicht die gesamte eigentliche Arbeit erledigen zu lassen und separate "Präsentations" -Ebenen für die Web-App (JSPs) und den REST-Controller hinzuzufügen. Dies wären separate Controller, in die der Dienst eingespeist würde. Alternativ können Sie auch nur einen REST-Service verwenden und die gesamte Präsentationslogik auf der Clientseite gemäß der vorherigen Antwort erstellen.

Außerdem bin ich kein großer Fan von Maven-Modulen. Die Art und Weise, wie unser Java-Shop Ihr ​​Projekt implementieren würde, besteht darin, regelmäßige Versionen der Service-Schicht zu erstellen und dann die Präsentationsebenen von der neuesten Version abhängig zu machen. Es gibt Raum für Diskussionen darüber, aber es funktioniert sicherlich für uns. Wir würden die Webschnittstelle und die REST-Schnittstellen als separate Maven-Projekte verwenden, da sie normalerweise in verschiedenen .war-Dateien gespeichert sind und daher eine separate Bereitstellung erfordern.

Übrigens würde ich die Notwendigkeit verstärken, sich mit Build- und Abhängigkeitsmanagement-Tools vertraut zu machen. Sobald Ihr Projekt eine angemessene Größe erreicht hat, benötigen Sie diese. Kostenlose Tools wie Maven, Jenkins und Nexus machen das Release-Management weniger problematisch.

Kiwiron
quelle