Spring Boot

Ich habe mal ein Spring-Boot-Projekt erstellt und richte mich häuslich ein. Das wird wohl eine Weile dauern, und jetzt werde ich auch noch nichts committen.

Der Stand:

  • Security ist prinzipiell vorhanden, aber ich habe Basic Auth erst mal abgeschaltet. Muss erst mal schauen, wie das dann mit dem Login geht
  • Freemarker-Templates werden ausgeführt (nachdem ich den Suffix in den application.properties auf .ftl.html gesetzt habe, Standard ist .ftl)

Nächste Schritte:

  • Unterschiede zu Ninja bei der Request-Verarbeitung ausbügeln
  • Ich versuche mal H2 für die Entwicklung zu nutzen, damit man kein PostgreSQL braucht
  • dafür müsste ich alle DB-Einstellungen profilspezifisch machen, also ein Development-Profil anlegen (später Production- und Test-Profil)
  • Entities und Services rüberkopieren

Bwah! Da drücke ich die letzten Male das IDEA-Update 14.1 EAP weg, und jetzt lese ich, dass das besseren Spring Boot Support hat: Faster Spring Boot with IntelliJ IDEA 14.1 | JetBrains IntelliJ IDEA Blog

Gleich nochmal neu das Ganze…

[ot]Schön zu lesen, dass es mit Spring Boot in IDEA weiter geht. Ich warte jetzt schon einige Zeit auf IDEA-132738. Der “Bug” (eigentlich eher “fehlendes Feature”) hängt damit zusammen, dass IDEA Spring-Projekte mit Java-Config noch nicht so ganz versteht.
Mit einer Unterstützung von Spring Boot muss das ja zwangsläufig kommen, da Spring Boot die Java-Config verwendet (soweit ich weiß).[/ot]

Hab’s ausprobiert, kein großer Unterschied. Man muss nicht auf die Initializr-Seite gehen, sondern kann das Projekt über IDEA erzeugen. Richtig geöffnet wird es dann aber ganz normal via POM. Keine Ahnung, ob da jetzt irgend etwas besser voreingestellt war.

Spring MVC macht einen ziemlich mächtigen Eindruck, aber da muss ich mich auch erst reinfitzeln. Es ist auch immer schwer, an Infos über Spring 4 ranzukommen, weil der Löwenanteil von Tutorials und so immer noch Spring 3 ist, und da weiß ich immer nicht, ob es inzwischen vielleicht einfacher geht. Ich will auf keinen Fall den alten Code nur “irgendwie zum Laufen” bekommen, er soll schon den Best Practices folgen, auch wenn es etwas länger dauert.

Spring Boot ist ziemlich cool, aber bei der ganzen Magie muss man auch erstmal das richtige Hebelchen finden, wenn die Defaults nicht passen…

Hast du konkrete Fragen? Ich bin zwar auch kein Spring-Profi, aber mittlerweile habe ich mich schon durch einen Haufen Quellcode von Spring Mvc gequält, sodass ich vielleicht auch die ein oder andere Antwort parat habe.
Ansonsten habe ich das Buch Spring in Action in der vierten Auflage, dort wird Spring 4 behandelt.

[QUOTE=cmrudolph]Hast du konkrete Fragen? Ich bin zwar auch kein Spring-Profi, aber mittlerweile habe ich mich schon durch einen Haufen Quellcode von Spring Mvc gequält, sodass ich vielleicht auch die ein oder andere Antwort parat habe.
Ansonsten habe ich das Buch Spring in Action in der vierten Auflage, dort wird Spring 4 behandelt.[/QUOTE]

Ich überlege gerade, ob ich mir das Buch auch anschaffe…

Mich würde hauptsächlich interessieren, welche Form des Aufrufs (ModelMap, ModelAndView…) für unsere Zwecke die beste ist, und welche Objekte ich als Argumente der Controller-Methoden alles angeben kann. Bei Ninja konnte ich sogar eigene Parametertypen erlauben, in dem ich entsprechende Resolver-Klassen (weiß jetzt den genauen Terminus nicht) registriert habe.

Dann gibt es bei Ninja den FlashScope für einmalige Fehler- und Erfolgsmeldungen, was es bei Spring MVC auch zu geben scheint, aber die genaue Syntax ist mir noch nicht untergekommen.

Dann wäre noch interessant zu wissen, wie man “globale” Sachen (wie es z.B. die i18n-Methode in Ninja ist) für Freemarker bereitstellt, ohne das jedesmal mit angeben zu müssen. Ginge das mit @ModelAttribute?

Ich finde das Buch wirklich gut, kann es nur weiterempfehlen.

Ich arbeite meistens mit einem String als Rückgabewert, der den Templatenamen angibt. Bei REST-Schnittstellen gebe ich die Objekte direkt zurück, sodass sie durch das konfigurierte Marshalling entsprechend “verpackt” werden. Die anderen Optionen verwende ich nur in speziellen Fällen. Binding ans Modell mache ich idR mit einem Model-Parameter und nicht mit einem Rückgabewert ModelAndView.

Diese Frage (sofern ich sie richtig verstanden habe) beantwortet die Referenzdokumentation hervorragend: 17.*Web MVC framework

Hier ist das grob beschrieben: 17.*Web MVC framework

Je nachdem was du genau meinst, ja. Mit einem ModelAttribute an einer Controllermethode: 17.*Web MVC framework

Diese Fragen werden übrigens auch alle im genannten Buch beantwortet :wink:

*** Edit ***

Ja, das geht natürlich auch, ich meine mit RequestMappingHandlerAdapter. Ich kann dir bei Bedarf heute Nachmittag auch sagen, wo man diese in der JavaConfig registriert, damit sie angewendet werden.

Danke, das hilft mir schon mal ordentlich weiter.

Das Wetter war am WE zu gut, nach der aktuellen miesen Voraussage dürfte sich die fjorum-Umstellung deutlich beschleunigen :slight_smile:

Achso, weil du i18n angesprochen hast: das läuft bei Spring über eine konfigurierte MessageSource, die du dir einfach in den Controller injecten kannst. (Siehe hier)

Ich habe wieder einige Fortschritte gemacht. Über eine Methode mit @ModelAttribute kann ich Freemarker mit globalem Zeugs versorgen (wie der i18n-Methode). Allerdings fehlen noch die ganzen js-Bibliotheken wie Bootstrap, nur will ich die natürlich nicht einfach ins Projekt reinkopieren. Ich schaue mir als nächstes mal https://github.com/efsavage/Bootstrap-Maven und ähnliches an…

H2 scheint prinzipiell zu laufen. Ich habe mal Category als einfachste Entity rübergezogen, das JpaRepository dazu angelegt und den CategoryService entsprechend angepasst (sieht viel aufgeräumter aus). Testen konnte ich das noch nicht, aber zumindest gab es keine Beschwerden :slight_smile:

Soho, Bootstrap & Co funktionieren jetzt als webjars. Eigentlich einfach, aber trotzdem frickelig…

Ich brauche die Übersetzungen ja hauptsächlich in den Templates, weniger im Controller.

Statt die Übersetzungsmethode vom Controller aus über das Model zum Template “durchzuschleifen” (was auch funktioniert) habe ich jetzt die eingebaute Lösung gefunden:

  • Spring-Boot gabelt meine Properties-Dateien anscheinend ganz automatisch auf (obwohl es auch eine explizite Setting spring.messages.basename für die application.config gibt)
  • Im Freemarker-Template braucht man einen Import <#import "/spring.ftl" as spring/>
  • Danach stehen die “Übersetzungen” als <@spring.message "hier.dein.key"/> zur Verfügung

Funktioniert sauber, auch wenn mir die ganze Magie langsam ein wenig unheimlich wird…

[QUOTE=Landei]- Im Freemarker-Template braucht man einen Import <#import "/spring.ftl" as spring/>

  • Danach stehen die “Übersetzungen” als <@spring.message "hier.dein.key"/> zur Verfügung

Funktioniert sauber, auch wenn mir die ganze Magie langsam ein wenig unheimlich wird…[/QUOTE]
Dort wird garantiert auch nur die genannte MessageSource bzw. dessen Resolver-Methode an @spring.message gebunden :wink:
Hast du mal in die spring.ftl hineingesehen?

Ja, hab mal drübergeblinzelt. Interessantes Zeugs, nicht nur zur Internationalisierung, sondern z.B. auch für die Formular-Verarbeitung oder Fehlerbehandlung. Ist auch eine Vorlage, wie man Funktionalität selbst in Templates bereitstellen kann.

Die Umstellung dauert wesentlich länger als gedacht, aber auf der anderen Seite habe ich das Gefühl, dass die gefundenen oder möglichen Lösungen dann auch sehr solide und bequem sind.

Als nächstes schaue ich mal, wie das mit dem User bei Spring Security läuft. Die Category-Entity werde ich auch nochmal überarbeiten, anscheinend würde eine rekursive Struktur gleich zwei Fliegen mit einer Klappe schlagen (bessere Gliederungsmöglichkeiten für die Nutzer, einfachere Implementierung einer Reihenfolge mit der Möglichkeit zum Umordnen mittels @OrderColumn)

Bei Spring-Security würde ich dir ans Herz legen, die Referenzdokumentation zumindest auszugsweise durchzulesen. Auch die ist sehr gut geschrieben und die Konzepte werden gut erklärt. Welche Klasse wofür zuständig ist, ist ansonsten nicht so schnell durchschaubar.

Bei der Definition von Benutzern und Rollen unterstützt Spring nur relativ wenig, weil noch keine starre Struktur vorgegeben ist.
Ich hab hier einen UserManager rumliegen, der auf JPA aufbaut. Den kann ich heute Nachmittag ggf. mal posten, dann hast du einen Ansatzpunkt.

Ich habe jetzt die Spring-Version gepusht (der letzte Ninja-Stand ist unter dem Tag LAST_NINJA zu finden). Es geht natürlich so gut wie nichts und es fehlen große Brocken Code, aber ich denke, dass so mal schneller jemand reinschauen kann, wenn ich nicht weiterkomme.

Kannst du das Datenbankschema auch noch committen?

*** Edit ***

Und was macht die LICENSE.htm da im repo?

Das DB-Schema existiert noch nicht, und braucht es hoffentlich auch nicht, wenn H2 so läuft, wie ich es mir vorstelle. Spricht ja nichts dagegen, dass im Dev-Mode die Tabellen von Hibernate erzeugt werden, oder?

License.htm entferne ich, war ein Fehler beim herumgitten.

Meines Erachtens nach nicht.

Du hast in der Konfiguration spring.jpa.show-sql = true gesetzt. Das ist suboptimal, da hibernate dann auf stdout loggt. Viel besser ist es, den logger org.hibernate.SQL auf debug zu setzen.
Siehe dazu auch die Implementierung in org.hibernate.engine.jdbc.spi.SqlStatementLogger#logStatement() an:

    if ( format ) {
        if ( logToStdout || LOG.isDebugEnabled() ) {
            statement = formatter.format( statement );
        }
    }
    LOG.debug( statement );
    if ( logToStdout ) {
        System.out.println( "Hibernate: " + statement );
    }
}```

Kann ich gern ausprobieren, log-level sollte ich direkt in der application.config setzen können.