Frühling MVC, Thymeleaf & REST

Ich habe derzeit ein Projekt mit einem Spring Controller und Thymeleaf, um eine kleine Browser-App zu erstellen. Die Reglerklasse wird als deklariert

@Controller public class MyController { 

Im Inneren des Controllers habe ich einen GET definiert als

 @RequestMapping(value = "/foobars", method = RequestMethod.GET) String index(Model model, --- more params ---) { //call repository and get foobarsList //model.addAttribute("foobars", foobarsList); ... return "foobars/foobarThymeleafTemplate" } 

Das Call-Repository und erhalten foobarList ist ein Aufruf zu einem MongoRepository definiert als:

 public interface FoobarRepository extends MongoRepository< ... cut for brevity> { @RestResource(rel = "by-id") Marker findMarkerById(String id); ... additional @RestResources cut for brevity ... } 

Auch hier sieht die Browser App gut aus. Die GET ruft das Repository an, füllt das Modell mit der Liste der foobars und Thymeleaf macht das Ding mit dieser Liste.

PROBLEM: Jetzt muss ich auf dieselben Daten von einer Android App zugreifen und ich würde es vorziehen, REST zu benutzen und einfach nur JSON in der Android App zu verbrauchen. Ich möchte Thymeleaf behalten, aber die Browser-App umgestalten, wenn nötig.

FRAGE: Gibt es einen Weg, irgendwie den gleichen @Controller zu benutzen oder muss ich einen zweiten FoobarRestController mit @RestController mit / restFoobars Endpunkten pflegen? Der zweite REST-Controller funktioniert sicher, aber es scheint irgendwie schlampig … schlechtes Design.

Ihre Gedanken und Empfehlungen?

Danke noch einmal. -Reich

2 Solutions collect form web for “Frühling MVC, Thymeleaf & REST”

Explosion Crud

Verwenden Sie den @Controller , um die Arbeit der Handhabung der HTML-Seite @Controller und mit dem Repository können Sie die Entity über Rest API für die grundlegenden Aktionen wie crud mit SPRING-DATA-REST , um Ihre Entitäten zu entlarven. Ich denke, du machst es schon, indem du den Code ansiehst

  @RestResource(rel = "by-id") Marker findMarkerById(String id); 

Expose Geschäftslogik

Wenn Sie eine Geschäftslogik freigeben möchten, müssen Sie eine Service Ebene erstellen und sie einfach über Ihren @Controller für die Webseite @Controller . Und einen anderen Controller als @RestController für die Web-API-Schnittstelle erstellen.

Sie können beachten, dass Sie hier keinen Code duplizieren, da die Logik an der einzigen Stelle in der Service-Ebene geschrieben wird. Aber mit verschiedenen Controllern für verschiedene Zwecke.

Wie Sie nicht brauchen alle Logik in Web-Seite, um API ausgesetzt werden, verwenden Sie separate Controller für REST kann eine saubere Design-Implementierung für Ihren Code, wenn Sie app.web Ihren Code als app.web und app.api .

Denkanstöße

Verwenden Sie eine komplette REST-API-Implementierung für Webseiten und Android. Dann verwenden Sie AngualarJS oder backboneJs , um die Client-Seite Implementierung mit HTML5 zu machen. Ich denke, das ist die Zukunft.

Mein bevorzugter Ansatz hier ist die Vererbung zu verwenden:

 @RequestMapping('/foobars') abstract class FoobarBaseController { @RequestMapping abstract listAll() } @Controller class FoobarHtmlController extends FoobarBaseController { @Override ModelAndView listAll() { new ModelAndView('foobars/foobarThymeleafTemplate', [foobars: foobarsList]) } } @RestController @RequestMapping('/foobars', produces = MediaType.APPLICATION_JSON_VALUE) class FoobarJsonController extends FoobarBaseController { @Override Collection<Foobar> listAll() { foobarsList } } 

Alternativ, wenn es BaseController , die Eingaben oder dergleichen zu überprüfen, können Sie das im BaseController und eine abstract listAllResponse(DomainObject foo) , die dann das entsprechende ModelAndView (HTML) oder DTO (JSON) zurückgibt.

Der Fall ist, dass man nicht nur einen Teil des @RequestMapping , also musst du den Klassenteil der Mapping wiederholen, wenn du den Parameter produces spezifiziert hast, aber du kannst die Methodenebenen-Mappings ohne n Problem.

Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.