Am 31.10.2018 wurde das Update Release von Spring Tool Suite 4 in der Version 4.0.1 veröffentlicht. Der Download steht unter https://spring.io/tools zur Verfügung oder über Updates innerhalb der Eclipse Installation.

Spring Bugfixes

  • NPE innerhalb des SpringIndexer
  • Spring Boot configuration property auto-completion bietet keine Properties der Super Klassen an
  • Jede Menge NPEs im Language Server behoben
  • Live Boot Hint Decorators funktionieren nicht, wenn in der Anwendung ObjectMapper mit NON_DEFAULT vorhanden ist
  • Property Support funktioniert nun auch mit verschachtelten Projektstrukturen

Eclipse

  • Support für das neue Buildship (Gradle Plugin) in der Version 3.0
  • Eclipse enthält nun auch wieder Server Adapters für Apache Tomcat

Full Changelog

Alle Änderungen finden sich wie immer im Wiki.

Spring Boot 2.1.0

Am 30.10.2018 wurde Spring Boot 2.1.0 als erstes Punktrelease veröffentlicht. Auch diesmal gibt es wieder jede Menge interessante und wichtige Neuerungen in dem beliebten Java Framework.

Welche Frameworks wurden geupdatet?

Zunächste wollen wir uns einen Überblick über die geänderten Abhängigkeiten von Spring Boot 2.1.0 verschaffen:

  • Hibernate 5.3
  • Micrometer 1.1
  • Reactor Californium
  • Spring Data Lovelace
  • Spring Framework 5.1
  • Tomcat 9
  • Undertow 2

Performance Verbesserungen

Als Teil der anhaltenden Bemühungen die Performance von Spring Boot Anwendungen stetig zu steigern, wurde teilweise ein signifikater Fortschritt erziehlt bei den Startupzeiten und dem Speicherverbrauch.

Wie bereits in dem Artikel Spring Boot 2.1 Changelog beschrieben, können Anwendungen jetzt im sogenannten deferred Mode von Spring Data JPA gestartet werden. Dabei wird die Initialisierung (das Bootstrapping) von Hibernate in einen Hintergrund Thread ausgelagert und paralell zur restlichen Initialisierung der Anwendung ausgeführt.

spring.data.jpa.repositories.bootstrap-mode=deferred    

Java 11 Support

Mit dem Update auf Spring Framework 5.1 folgt das Spring Boot 2.1.0 Framework wartet ebenfalls mit der Unterstützung von Java 11 auf. Gleichzeitig wird weiterhin Java 8 als minimale Java Version beibehalten.

In den Properties werden DataSize Angaben unterstützt

In der application.properties können jetzt als Einheiten GB,MB,KB etc. angegeben werden. Ähnlich zu den unter Spring Boot 2.0.0 eingeführten Durations.

Neue Actuator Endpoints

Es wurden neue Actuator Endpoints zur Verfügung gestellt. Ein Endpoint stell Informationen zum CacheManager dar und der zweite Endpoint gibt eine Graph Representation der Komponenten von Spring Integration.

/actuator/caches
/actuator/integrationgraph  

Bean Overriding

Mit dem Release 2.1.0 wird das Überschreiben von Bean per default verhindert. Sollte dieses in der Anwendung weiterhin benötigt werden, so kann dieses über die Property

spring.main.allow-bean-definition-overriding=true

geändert werden.

Änderungen die Spring Security betreffen

Bislang war es so, dass wenn spring security im Classpath vorhanden war, dass ausnahmslos alle Endpoints gesichert waren. Hiervon gibt es jetzt eine Ausnahme! Die Endpoints /info und /health werden wegen der Konsistenz jetzt nicht mehr automatisch gesichert. Sollte diese Endpoints gesichert werden, dann muss dieses expliziet geschehen.

Änderungen im Logging

Mit Spring Framework 5.1 wurden auch Verfeinerungen im Logging vorgenommen. Es sind Spring MVC und Spring WebFlux von den Änderungen betroffen. Möchte man das alte Debuggingverhalten von Spring Boot 2.0.0 wiederherstellen, dann kann das über die Property logging.level.web geschehen.

logging.level.web=debug # altes Verhalten vor Spring Boot 2.1.0 wiederherstellen

Weitere Änderungen

Weitere Änderungen sind im Spring Boot 2.1.0 Changelog zu entnehmen.

Alle Änderungen in diesem Release sind wie immer ausführlich im Release Notes Spring Boot 2.1.0 vorhanden.

Updates der Abhängigkeiten im Einzelnen

An dieses Stelle werde ich kurz auf die wichtigsten Änderungen in den Frameworks eingehen.

Hibernate 5.3.7

Der Changelog von Hibernate ist relativ klein und enthält wenig aufregenes.

Micrometer

Das Update von Micrometer enthält eine Reihe von weiteren Monitorsystemen. Mit AppOptics, Azure Monitor, Dynatrace, Elastic, Humio, KairosDB, Stackdriver, Sysdig, StatsD kommen also insgesamt 9 weitere Monitorsysteme neu hinzu.

Ebenfalls werden neue Metriken für Jetty Server Thread Pool, PostgreSQL Datenbank, Festplattenplatz, Log4J 1.2 und Kafka gesammelt.

Neben den neuen Metriken und den Anbindungen an die Monitorsysteme, werden eine ganze Reihe weiterer Verbesserungen in Micrometer eingebaut.

Spring Reactor Californium

Die Namensgebung für den Releasetrain des Reactor Projects wird nach den Elementen vergeben. Aktuell ist Californium angesagt. Neues hierzu ist in dem Video von der JavaOne zu sehen.

SpringPlatform

Die SpringPlatform hat am 24.09 bis zum 27.09.2018 in Washington stattgefunden. Pivotal hat in ihrem Youtube-Kanal jetzt alle Videos bereitgestellt.

Sehenswertes

Vorträge die mir sehr gut gefallen haben:

  • Josh Longs Vortrag stellt die unmittelbaren Vorteile der Verwendung von Cloud Contracts anhand eines Rest Services und Client dar. Zunächst werden die Client / Service Teile mit herkömmlichen Unittest gebaut und dann zeigt erspannend, dass ,obwohl beide Unittests grün waren, die Anwendung im Ganzen nicht funktioniert und zeigt nun auf wie leicht dieses Problem mit Cloud Contracts gelöst werden kann.

  • Neues aus Project Reactor Codename Californium. Der Releasetrain beinhaltet Reactor Core 3.2, Reactor Addons 3.2, Reactor Netty 0.8. Springframework 5.1 (und auch das bald erscheinende SpringBoot 2.1) beinhalten Californium. Flux und Mono können getagt werden und stehen als Micrometer Metrics zur Verfügung. Neue Operationen stehen zur Verfügung. doOnDiscard fängt alle Elemente die in dem Flow verworfen werden auf. onErrorContinue kann Exception abfangen und der Flow wird nicht durch fatale Fehler zerstört. Mit retryBackoff wird ein mächtiges Retry zur Verfügung gestellt.

  • JUnit 5 kurz und knapp. Sehr kompakte Übersicht. Features in der nächsten Version 5.4. JUnit 5 und Spring. Ab SpringBoot 2.1 kann @ExtendsWith(SpringExtension.class) entfallen. Es muss die Testmethode nur mit @SpringBootTest annotiert werden.

  • Das AxonFramework wird demnächst einen OSS Server enthalten. Der AxonServer weiß welche Applicationen laufen und wo welche CommandHandler vorhanden sind, da die Microservices das dem Server propagieren. Das heißt Autodiscovery für die CQRS Dienste kann mit dem Server realisiert werden. Die Microservices müssen nur das AxonFramework integrieren. Somit lassen sich die Anwendungen einfach skalieren.

  • Reactive Relation Databases Connectivity. Das Project R2DBC verspricht reaktiven Zugang zu Datenbanken. Aktuell gibt es einen H2 und einen Postgresql Client. Es sollten bald weitere Clients wie zum Beispiel für MySQL folgen. Es wird eine Demoanwendung auf Basis auf dem letzten SpringBoot erstellt. Lukas Eder ist auch bereits in R2DBC involviert und plant Jooq um R2DBC zu erweitern, so dass nicht nur JDBC als alleinige Schnittstelle benutzt werden kann. Die Unterstützung ist für Version 3.12 geplant.

  • Spring Data JDBC ist ein neues sehr einfaches und begrenztes ORM. Es steht mit SpringBoot 2.1.0.M4 zu Verfügung. Es werden die Unzulänglichkeiten von Hibernate angesprochen. Als neues Feature kommen Derived Queries in der nächsten Version, sowie Unterstüzung für Sorting und Paging. Auch hier wird auf den Reactive Zug aufgesprungen und R2DBC angesprochen. Projekthomepage befindet sich auf https://spring.io/projects/spring-data-jdbc.

  • Simon Ritter gibt einen kurzen Überblick über JDK 9,10,11 und zukünfitge Versionen und deren mögliche Features. Die Modularität die mit JDK 9 eingeführt wurde über das neue Release Model und das ab JDK 11 OpenJDK und OracleJDK den gleichen Funktions-/Features Umfang besitzen. Flight recorder und Mission Control sind ab JDK 11 Open Source. Browser Plugin, Java Web Start und JavaFX werden entfernt. Open JavaFX wird unabhängig weiterentwickelt. Java 10 Local Variable Type Inference JEP 286. Mit JVM 10 Java liest nicht mehr die CPU und vorhandenen Speicher des Hostsystems aus und respektiert die Resourcen vorgaben vom Docker Container. Mit JEP 323 wurde Lacal Variable Syntax erweitert, so dass var auch verwendet werden kann. Es gibt hierfür nur einen sinnvollen Einsatz. Nämlich in Verwendung mit Annotationen im Lambda-Ausdrücken.

  • In diesem Vortrag werden 2 unsichere Anwendungen, eine WebApplication und ein RestClient, mit einem OAuth 2.0 Resource Server mit Spring Security 5.1 gesichert. Joe Grandja und Josh Cummings stellen anhand einer Demo die neuen Fähigkeiten des Resource Servers und Neuerungen im WebClient vor. Quelltexte https://github.com/jzheaux/messaging-app/tree/springone2018-demo, https://github.com/spring-projects/spring-security/tree/master/samples/boot/oauth2webclient und https://github.com/spring-projects/spring-security/tree/master/samples/boot/oauth2resourceserver.

Endlich ist die Version 4 der Spring Tool Suite da. Die Spring Tool Suite basiert immer noch auf Eclipse, aber da die Unterstützung auf dem Language Server Protokoll beruht lassen sich auch andere Editoren oder IDEs damit nutzen.

Änderungen seit Spring Tool Suite M15

  • Spring Tool Suite kann jetzt unter JDK 11 laufen
  • Application Properties können nach YAML konvertiert werden
  • Vereinheitlichung der Preference Pages

Alle Änderungen lassen sich im Changelog nachlesen.

Download

Die Tool Suite kann unter https://spring.io/tools runtergeladen werden.

Features Installment

In seinem letzten Installment stellt Josh Long STS 4 anhand eines MongoDB driven RestController vor. Auf die Features von Spring Tool Suite geht er ab hier in dem Video ein.

Heute wurde Spring Framework 5.1 GA freigegeben. Zu den Neuerungen gehören warning freies nutzen des JDK 11 mit LTS, initialer Support für GraalVM, Hibernate 5.3. Mit der Freigabe von Spring Boot 2.1 M4 nächste Woche können die neuen Features über den start.spring.io getestet werden.

Weitere Highlights Spring Framework 5.1 GA

  • Warnungsfreie Nutzung unter JDK 11 im Class- und Modulepath
  • Upgrade Reactor Core 3.2 und Reactor Netty 0.8

Mit dem Upgrade erhält HTTP2 Support in Netty einzug in das Release. Kurzbeschreibung Californium.

  • Upgrade auf ASM 7.0 Beta und CGLIB 3.2.8. Diese sind nicht als Abhängigkeiten, sondern sind inline im Spring-Core Repository eingebunden.

  • PathResource wird durch NIO.Path ersetzt

  • Performanceverbesserungen in den Core Typen und der Annotationsauflösung

  • Verbesserte Logausgaben. Weniger Ausgaben im INFO-Level, verbesserte Lesbarkeit im DEBUG-Level und Details sind jetzt im TRACE-Level

  • Unterstützung von und und oder Bedingungen bei Profilzuweisungen
  • Sauberes und konsistente Erkennung von verschachtelten Konfigurationsklassen

Hier zeige ich kurz die wichtigsten Änderungen in SpringBoot 2.1 auf. Aktuell ist der 3. Milestone erreicht.

SpringBoot 2.1 M1

Features

  • Reaktive Health Indikator für Cassandra
  • JUnit 5 @ExtendWith(SpringExtension.class) kann entfallen

Die Annotation @ExtendWith(SpringExtension.class) wird in den @…Test Annotationen annotiert, so dass diese nicht expliziet angegeben werden muss.

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class SampleJunitJupiterApplicationTests {

Wird zu…

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class SampleJunitJupiterApplicationTests {
  • Logback unterstützt nun ProfileExpression
  • JPA 2.2 wird erreicht (Streaming von ResultSets ist nun möglich)
  • Hibernate Metrics werden in Actuator zur Verfügung gestellt

Konfiguration:

spring.jpa.properties.hibernate.generate_statistics=true
  • Support für Undertow 2.0 und Tomcat 9

  • Wenn DevTools im Klassenpfad, dann wird bei Fehlern ein Stacktrace per Default ausgegeben.

Konfiguration:

server.error.include-stacktrace=ALWAYS

Mit dem Update auf Hibernate 5.3.0 Final und Java Persistant Api 2.2 sind das Streamen von ResultsSets möglich.

SpringBoot 2.1 M2

Features

  • Es wird verhindert das der MySQL Connector eine alte Version von Protobuf-java als Abhängigkeit einbringt
  • Support Java 11

Mit dem Update auf Assertj 3.11 wird Java 11 unterstützt.

  • Spring Data JPA Bootstrap Mode kann konfiguriert werden

Es gibt neben DEFAULT zwei neue Initialisierungsarten LAZY und DEFERRED. Mit Lazy und Deferred lassen sich die Startupzeiten der Application zum Teil drastisch reduzieren. Siehe Deferred Example.

Der Unterschied zwischen Lazy und Deferred ist, dass bei Deferred die Validierung vor der ersten Nutzung der Anwendung durchgeführt wird. D.h. nach dem ApplicationContext zur Verfügung steht. Bei Lazy geschied dies erst dann, wenn auf ein Repository das erste Mal zugegriffen wird.

Gerade im Bezug auf kurze TurnAround-Zeiten bei der Entwicklung ist dieses von Vorteil. Ist DEFERRED default, wenn DevTools eingebunden werden?

  • Es gibt einen neuen Starter für OpenID Connect/OAuth2 spring-boot-starter-oauth2-oidc-client

  • Feintuning und Review im Logging

  • FormContentFilter ersetzt HttpPutFormContentFilter

Dependencies

Unter anderem wurde folgende Anhägigkeiten erneuert:

  • Lombok 1.18.2
  • Influxdb Java 2.12
  • Mysql 8.0.12
  • Hazelcast 3.10.4

SpringBoot 2.1 M3

Features

  • Minimale Version von Gradle wurde auf Version 4.4 angehoben
  • Verzögerte Ausgabe der DevTools Loggingeinträge

Mit defer devtools logging kann die Ausgabe der Loggingeinträge bis nach der Ausgabe des SpringBoot Logos verzögert werden.

  • Unterstützung von Logging Gruppen

Logger können jetzt zu Gruppen zusammengefasst werden. Somit kann einer Gruppe ein Level zugewiesen werden.

# define group
logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
# set level
logging.level.tomcat=TRACE
  • Es kann der BackgroundPreinitializer abgeschaltet werden

In bestimmten Umgebungen wo nur eine CPU zur Verfügung steht, macht es keinen Sinn die Initialisierung in den Hintergrund in einem extra Thread zu verlagern. Dieses kostet nur extra CPU Zeit wg. Kontextwechsel.

Beispiel: spring.backgroundpreinitializer.ignore=true # Whether background preinitializer should be ignored.

  • JAXB wurde als Abhängigkeit hinzugefügt

Mit Java 10 wurde JAXB als deprecated markiert und mit Java 11 ganz entfernt. Da Java 11 eine LTS Version ist, wurde kurzum JAXB als Abhängigkeit hinzugefügt. Das vermindert auch wieder die Abhängigkeiten in Maven oder Gradle Buildskripten.

  • Fehler in der JSON Konfiguration werden jetzt mit einer Exception quittiert

Da nur das Ausgeben von warnings in den Logger zu unvorhersehbaren Verhalten führt, wurde jetzt das Verhalten geändert und eine JsonParseException geworfen.

  • Der Parameter max HTTP header size ist jetzt für alle unterstützten Container gleich

  • Es wird eine Warnung geloggt, wenn die Application als Root läuft

Mit runUser kann dem Startskript mitgeteilt werden unter welchem Benutzer das Programm gestartet werden soll. Ist das Argument runUser nicht angegeben, so wird das Programm unter der ID des Benutzers dem das Skript gehört ausgeführt. Gehört das Skript z.B. Root (UID = 0), dann wird dieses jetzt mitgeloggt.

  • Der Object Mapper Jackson wird jetzt als Singleton instanziert

Durch die diese Optimierung werden neue Instanzen des JacksonJsonParser schneller erstellt.

Dependencies

Unter anderem wurde folgende Anhägigkeiten erneuert:

Hier die Highlights der neuen Milestones M15 der Spring Tool Suite 4. Die meisten Verbesserungen gab es im Bereich der Live Hovers. Hier wurde die Performance und der Informationsgehalt gesteigert.

Changelog

Spring Boot

  • Der Informationsgehalt in den Live Hovers wurden verbessert
  • Informationen zu den autowired Feldern und Konstruktoren und den @Bean Definitionen wurden verbessert und stellen mehr Informationen zur Verfügung
  • Performanceverbesserungen von Live Hovers bei entfernten Boot Apps
  • Experimentelle Code Lenses (Code Minining) Informationen. Muss in den Preferences freigeschaltet werden
  • Verbesserte Performance und geringerer Speicherverbrauch des Live Hovers Updatemechanismus
  • Fehlender Zeilenumbruch in Live Hovers für Request Mappings gefixt
  • Resource Links in Live Hovers für entfernte Anwendungen funktionieren jetzt

Eclipse

  • Neue Versionen von Spring Boot CLI und Spring Cloud CLI (werden für Dashboard verwendet)

Methode 1 Einfach

Die wohl einfachste Methode ist einfach spring.jpa.show-sql auf true zu setzen.

spring.jpa.show-sql=true

Damit das ganze lesbarer ist, kann man auch gleich die Formatierung des SQL Queries veranlassen. Das ganze wird mit spring.jpa.properties.hibernate.format_sql gesteuert. Setzt man auch dieses Wert auf treu, dann erhält man das gewünschte Ergebnis. Leider ist dieses komplett unoptimiert und geht direkt am Loggingframework vorbei. Schlimmer noch die Parameter der Prepared Statements können nicht angezeigt werden.

Methode 2 Loggingframework

Mit den Einstellungen:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

Bekommt man das gleiche Ergebnis, aber die Ausgaben werden über das Loggingframework ausgegeben. Enums werden so aber nicht ausgegeben. Dafür muss separat folgender Schalter verwendet werden:

logging.level.org.hibernate.type.EnumType=TRACE

Fehlerbild

Beim Starten einer Spring Boot Anwendung unter JDK11 (Java 11 Umgebung) kommt es zu einer Fehlermeldung. Es betrifft auch das letzte Release 2.0.4.RELEASE.

Caused by: java.lang.NullPointerException: null
    at javassist.util.proxy.SecurityActions.setAccessible(SecurityActions.java:103) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.DefineClassHelper.toClass3(DefineClassHelper.java:151) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.DefineClassHelper.toClass2(DefineClassHelper.java:134) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:95) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.FactoryHelper.toClass(FactoryHelper.java:131) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:530) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.ProxyFactory.createClass2(ProxyFactory.java:515) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.ProxyFactory.createClass1(ProxyFactory.java:451) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.ProxyFactory.createClass(ProxyFactory.java:422) ~[javassist-3.22.0-GA.jar:na]
    at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.postInstantiate(JavassistProxyFactory.java:75) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:162) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:156) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:58) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    ... 46 common frames omitted

Ohne Änderung läuft die Anwendung unter JDK10 fehlerfrei.

Ursache der NullPointerException

Diese lässt sich auf einen Fehler in javassist zurückführen. Siehe issue 194 für weitere Informationen.

Fehler wurde in neuer GA gefixt

Der Fehler in javassist wurde mit 3.23.1-GA behoben. Als Workaround (dieser kann unerwünschte Seiteneffekte besitzen) kann man die Dependency in dem POM überschreiben.

Gradle

Mit Gradle muss bei der Verwendung des Spring Boot Dependencies Management Plugins im Abschnitt Dependencies javassist eingefügt werden. Das Einfügen überschreibt die impleziete Abhängigkeit von Spring-Boot-Data-JPA.

dependencies {
    // Override javassist version 3.22.0-GA from spring-boot-starter-data-jpa.
    // This fixes javassist runtime error with JDK11.
    // See https://github.com/jboss-javassist/javassist/issues/194
    compile('org.javassist:javassist:3.23.1-GA')
}

Mit gradle dependencies kann die Änderung leicht geprüft werden:

./gradlew clean dependencies | grep javassist
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
\--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA