Ich habe derzeit ein Projekt mit einem Spring-Controller und Thymeleaf, um eine kleine Browser-App zu erstellen. Die Controller-Klasse wird als
deklariert %Vor%Innerhalb des Controllers habe ich ein GET als
definiert %Vor%Das Aufruf-Repository und get foobarList ist ein Aufruf an ein MongoRepository , das wie folgt definiert ist:
%Vor%Auch hier sieht die Browser App gut aus. Das GET ruft das Repository auf, füllt das Modell mit der Liste der foobars und Thymeleaf erledigt es mit dieser Liste.
PROBLEM: Jetzt muss ich auf dieselben Daten von einer Android App zugreifen, und ich würde REST lieber verwenden und einfach JSON in der Android App verbrauchen. Ich möchte Thymeleaf behalten, werde aber die Browser-App bei Bedarf umgestalten.
FRAGE: Gibt es eine Möglichkeit, den gleichen @Controller zu verwenden oder muss ich einen zweiten FoobarRestController mit @RestController mit / restFoobars Endpunkten verwalten? Der zweite REST-Controller funktioniert sicher, aber es scheint irgendwie schlampig ... schlechtes Design.
Ihre Gedanken und Empfehlungen?
Nochmals vielen Dank. -Rich
Mein bevorzugter Ansatz ist hier die Verwendung der Vererbung:
%Vor% Alternativ können Sie, wenn die Eingabe oder ähnliches überprüft werden muss, diese in BaseController
implementieren und eine abstract listAllResponse(DomainObject foo)
haben, die dann die entsprechende ModelAndView
(HTML) oder DTO (JSON) zurückgibt.
Der einzige Nachteil dieses Ansatzes besteht darin, dass Sie nicht nur einen Teil von @RequestMapping
überschreiben können. Sie müssen also den Teil der Klasse wiederholen, wenn Sie den Parameter produces
angeben, aber Sie können das übernehmen Zuordnungen auf Methodenebene ohne Probleme.
Expose Crud
Verwenden Sie @Controller
, um die HTML-Seite zu bearbeiten, und verwenden Sie das Repository, um die Entität über die Rest-API für die grundlegenden Aktionen wie crud verfügbar zu machen, indem Sie SPRING-DATA-REST
verwenden, um Ihre Entitäten verfügbar zu machen. Ich denke, du machst es bereits, indem du dir den Code ansiehst
Geschäftslogik sichtbar machen
Wenn Sie eine Geschäftslogik bereitstellen möchten, müssen Sie eine Service
-Layer erstellen und sie einfach über Ihr @Controller
für die Webseite aufrufen. und erstellen Sie einen weiteren Controller als @RestController
für die Web-API-Schnittstelle.
Sie werden bemerken, dass Sie hier keinen Code duplizieren, da die Logik an dem einzelnen Punkt in der Service-Ebene geschrieben wird. Aber verschiedene Controller für verschiedene Zwecke verwenden.
Da Sie nicht die gesamte Logik in der Webseite für die API benötigen, kann die Verwendung des separaten Controllers für REST eine saubere Entwurfsimplementierung für Ihren Code sein, wenn Sie Ihren Code als app.web
und app.api
benennen können. .
Denkanstoß
Verwenden Sie eine vollständige REST-API-Implementierung für Webseiten und Android. Verwenden Sie dann AngualarJS
oder backboneJs
, um die clientseitige Implementierung mit HTML5 durchzuführen. Ich denke, das ist die Zukunft.
Tags und Links java android rest spring-mvc thymeleaf