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. TileServletcom.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>