Skip to main content

Migration einer bestehenden Anwendung auf Spring Boot

Dieser kurze Leitfaden soll die Schritte umreißen, die notwendig sind, um eine jadice web toolkit Integration nach Spring Boot zu migrieren.

Spring Boot Dependencies in der pom.xml ergänzen

Block <dependencyManagement>

<dependencies>
<!-- Let's import the Jadice Webtoolkit bill of material. JWT dependency
versions will be managed via this BOM. -->
<dependency>
<groupId>com.levigo.jadice.webtoolkit</groupId>
<artifactId>webtoolkit-bom</artifactId>
<version>${jwt.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>

Block <dependencies>

<dependency>
<groupId>com.levigo.jadice.webtoolkit</groupId>
<artifactId>webtoolkit-spring-boot-starter</artifactId>
</dependency>

Die üblicherweise bisher vorhandene Dependency auf webtoolkit-base kann entfallen, da diese über webtoolkit-spring-boot-starter eingebunden wird.

Dependencies für Entwicklung

Die folgenden Dependencies ermöglichen einerseits das Debuggen des Frontend-Codes (GWT) und andererseits wird das Entwickeln des Backends erleichtert.

<dependency>
<groupId>com.levigo.jadice.webtoolkit</groupId>
<artifactId>webtoolkit-spring-boot-devmode</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>

Block <build> <plugins>

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>

Kann beim Traditional Deployment (klassisches Deployment auf einem App-Server) entfallen. Beachten Sie hierzu die Anmerkungen im Kapitel Traditional Deployment.

SpringBootApplication erstellen

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.levigo.jadice.web.server.spring.autoconfig.EnableJWTSpringBootApplication;

@SpringBootApplication
// Activate jadice web toolkit support specifying the GWT module name for the entry point
@EnableJWTSpringBootApplication("com.acme.myapp.Application") // <-- Package where Application.gwt.xml is located
public class MySpringBootApp {

public static void main(String[] args) {
SpringApplication.run(MySpringBootApp.class, args);
}
}

Anwendungs-Properties konfigurieren

Typischerweise wird hierzu eine application.yml erstellt, die Einstellungen für Spring Boot, das jadice web toolkit und die Integration enthält.

Beispielhafte application.yml

webtoolkit:
#
# Annotation profile injection in conjunction with webtoolkit-spring-boot-starter
#
# Specify annotation profiles
annotationProfiles: /jwt-minimal-profile.xml, /jwt-second-profile.xml
# Specify default annotation profile (The value must match annotation-profile name in jwt-minimal-profile.xml)
defaultAnnotationProfile: JWT-Minimal
#
# "Standard" configuration options that can also be done programmatically via ConfigurationManager.
#
# Enable caching of tiles
tileCachingEnabled: false
# Choose a compression type
tileCompressionType: PNGJ_BEST_COMPRESSION
# Configure network settings
networkConfiguration:
# Set the timeout of a long poll query to 5 minutes
# note: longer intervals reduce the traffic overhead
longPollTimeout: 5m
# Set the duration the server aggregates answers for a client in order to send them in a batch to 20 milliseconds
# note: this window should be small otherwise a delay is recognicable
responseAggregationWindow: 20ms
# Set the timeout of an idle client session to 30 seconds
sessionTimeout: 30s
# Set the interval at wich the server sents keep alive message to the client to 30 seconds
keepAliveInterval: 30s
# OPTIONAL:
# If JWT runs under a specific url
#server:
# servlet:
# context-path: "/basicviewer/"

DocumentDataProvider und ServerOperations injizieren lassen

In den web toolkit Versionen vor 5.11 wurden DocumentDataProvider und ServerOperations im WebtoolkitServletContextListener registriert. Das ist unter Spring Boot nicht mehr nötig bzw. sinnvoll. Im Normalfall kann man die entsprechenden Komponenten direkt injizieren und auf das Einhängen der WebtoolkitServletContextListener -Erweiterung als @WebListener verzichten.

Konkret ist hierzu folgendes zu tun:

  • DocumentDataProvider umstellen
  • ServerOperations umstellen
  • Weitere Initialisierungen umstellen, die bisher im ContextListener vorgenommen werden (z.B. BufferManager). Die Initialisierung kann z.B. direkt in die Spring-Boot-Application (im Beispiel MySpringBootApp) verlagert werden.
  • Damit die Annotationen @WebFilter @WebListener und @WebServlet wie gewohnt funktionieren, muss der Haupt-Klasse (@SpringBootApplication) noch die Annotation @ServletComponentScan hinzugefügt werden:

Angepasste SpringBootApplication

@SpringBootApplication
// Activate jadice web toolkit support specifying the GWT module name for the entry point
@EnableJWTSpringBootApplication("com.acme.myapp.Application") // <-- Package where Application.gwt.xml is located
@ServletComponentScan(basePackages = {
"com.acme" // <-- The package of the specific application
})
public class MySpringBootApp {

public static void main(String[] args) {
SpringApplication.run(MySpringBootApp.class, args);
}
}

Dabei ist zu beachten, dass (mindestens) 2 Packages angegeben werden:

  • com.levigo.jadice.web: Dort befinden sich die JWT-Klassen wie z.B. TileServlet
  • com.acme: bzw. das Package der eigentlichen Anwendung

web.xml anpassen

Grundsätzlich muss die web.xml nicht unbedingt angepasst werden, es ist aber mehr im Sinne von Spring Boot, die dort definierten Servlets, Filter, etc. über entsprechende Annotationen laden zu lassen. Wenn diese Klassen über Annotationen geladen werden, kann die web.xml gänzlich entfallen. Eine Ausnahme bildet hier das Traditional Deployment, in diesem Fall darf die web.xml nicht entfallen.

Logging konfigurieren

Bei Verwendung eines Spring-Boot-Starters ist Logback das Default-Logframework. Details siehe https://www.baeldung.com/spring-boot-logging. Es empfiehlt sich, dieses zu nutzen. In der pom.xml ist hierzu lediglich eine Bridge für das jadice-util-logging-Framework auf slf4j zu ergänzen:

Block <dependencies>

<dependency>
<groupId>org.jadice.util</groupId>
<artifactId>logging-slf4j</artifactId>
</dependency>