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

  • Gibt es in modernen Versionen von Android eine automatische Aufgabenclearing?
  • Stellen Sie sicher, dass der SQLite auf Android UTF-8 als Zeichensatz verwendet
  • Generiere eine zufällige Farbe Java
  • Jackson ObjectMapper Konflikte Setterdefinitionen (Android.Graphics.Bitmap)
  • Wie kann man EditText nicht über XML in Android bearbeiten?
  • Stream Audio zu einem Telefonanruf Android
  •  @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

  • So klicken oder tippen Sie auf einen TextView-Text
  • Einstellen der benutzerdefinierten Schriftart auf alle TextViews
  • Android: Singleton, das zwischen Aktivität und Service verwendet wird
  • Wie zu reparieren "Fräulein einen Widerstand, wie wir warten auf WebCore Antwort für Touch-Down"
  • TabLayout nicht füllende Breite, wenn tabMode auf 'scrollable'
  • So aktualisieren Sie die Android-Mediendatenbank
  • 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.