Inhaltsverzeichnis

Alle Kapitel aufklappen
Alle Kapitel zuklappen
Vorwort
23
1 Einleitung und erstes Beispiel
33
1.1 Geschichte von Spring Framework und Spring Boot
33
1.1.1 Von Java SE über J2EE zu Spring
33
1.1.2 Spring Boot
38
1.1.3 Spring vs. Jakarta EE und Alternativen
40
1.1.4 Ein Spring-Boot-Projekt aufsetzen
44
1.1.5 Spring-Projekte in Entwicklungsumgebungen aufbauen
49
1.2 Dependencies und Starter eines Spring-Boot-Projekts
53
1.2.1 POM mit Parent-POM
53
1.2.2 Dependencies als Import
57
1.2.3 Vorabversionen von Spring über Repositories in der POM einbinden
58
1.2.4 Annotationsprozessoren konfigurieren
59
1.2.5 Starter: Dependencies des Spring Initializr
60
1.3 Einstieg in die Konfigurationen und das Logging
62
1.3.1 Banner abschalten
62
1.3.2 Die Logging-API und SLF4J
63
2 Container für Spring-managed Beans
67
2.1 Spring-Container
67
2.1.1 Container starten
68
2.1.2 SpringApplication instanziieren
69
2.1.3 SpringApplicationBuilder *
70
2.1.4 Was main(…) macht und nicht macht
71
2.1.5 Die run(…)-Methode liefert ConfigurableApplicationContext
71
2.1.6 Kontextmethoden
72
2.2 Design und Strukturierung einer Anwendung
75
2.2.1 Domain-driven Design und hexagonale Architektur
75
2.2.2 Hexagonale Architektur mit Domain-driven Design
77
2.2.3 Paketstruktur der Date4u-Anwendung
78
2.3 Spring-managed Beans durch Classpath-Scanning aufnehmen
81
2.3.1 Container mit Beans füllen
81
2.3.2 @Component
83
2.3.3 @Repository, @Service, @Controller
86
2.3.4 Classpath-Scanning mit @ComponentScan präziser steuern *
87
2.4 Interaktive Anwendungen mit der Spring Shell
91
2.4.1 Eine Spring-Shell-Dependency einbinden
92
2.4.2 Eine erste interaktive Anwendung
92
2.4.3 Shell-Komponente schreiben: @Command
93
2.5 Die Verweisspritze
96
2.5.1 Objektgraphen aufbauen
96
2.5.2 Inversion of Control (IoC) und Dependency-Injection
98
2.5.3 Injektionsarten
99
2.5.4 PhotoService und PhotoCommands
104
2.5.5 Mehrere Abhängigkeiten
107
2.5.6 Verhalten bei einer fehlenden Komponente
108
2.5.7 Optionale Abhängigkeit
109
2.5.8 Zyklische Abhängigkeiten *
112
2.5.9 Andere Dinge injizieren
113
2.6 Konfigurationsklassen und Fabrikmethoden
114
2.6.1 @Configuration und @Bean
115
2.6.2 Verständnisfragen zur Bean-Erzeugung und Namensauflösung
119
2.6.3 Parameter-Injektion einer @Bean-Methode
123
2.6.4 @Configuration-Bean und Lite-Bean
123
2.6.5 InjectionPoint *
126
2.6.6 Statische @Bean-Methoden *
129
2.6.7 @Import und @ImportSelector *
129
2.7 Abstraktion und Qualifizierungen
132
2.7.1 Der Name einer Bean und ihr Alias
132
2.7.2 Basistypen
133
2.7.3 No unique bean und Lösungsansätze
135
2.7.4 ObjectProvider
141
2.7.5 @Order und @AutoConfigurationOrder *
144
2.7.6 Verhalten bei ausgewählten Vererbungsbeziehungen *
146
2.8 Lebenszyklus der Beans
149
2.8.1 @DependsOn
149
2.8.2 Verzögerte Initialisierung (lazy initialization)
150
2.8.3 Bean-Initialisierung traditionell
152
2.8.4 InitializingBean und DisposableBean *
158
2.8.5 Vererbung der Lebenszyklus-Methoden
159
2.8.6 *Aware-Schnittstellen *
160
2.8.7 BeanPostProcessor *
160
2.8.8 Spring-managed Beans woanders anmelden
164
2.8.9 Hierarchische Kontexte *
166
2.8.10 Singleton und Prototyp zustandslos oder zustandsbehaftet
169
2.9 Annotationen aus »Jakarta Dependency Injection« *
170
2.9.1 Dependency für die Jakarta-Dependency-Injection-Annotationen
171
2.9.2 Spring-Mapping der Jakarta-Dependency-Injection-Annotationen
171
2.10 Autokonfiguration
172
2.10.1 @Conditional und Condition
172
2.10.2 Wenn, dann: @ConditionalOn*
175
2.10.3 Automagically
179
2.10.4 Die Debug-Protokollierung von Spring einschalten
183
2.10.5 Autokonfigurationen individuell steuern *
183
2.11 Spring Expression Language (SpEL)
186
2.11.1 ExpressionParser
187
2.11.2 SpEL in der Spring (Boot) API
188
3 Ausgewählte Module des Spring Frameworks
193
3.1 Hilfsklassen im Spring Framework
193
3.1.1 Bestandteile von org.springframework
193
3.2 Externe Konfiguration und das Environment
194
3.2.1 Konfiguration im Code und extern
194
3.2.2 Environment
195
3.2.3 Werte mit @Value injizieren
197
3.2.4 Environment-Belegungen über @Value und ${…} bekommen
199
3.2.5 @Value und Default-Werte
200
3.2.6 Zugriff auf Konfigurationen
202
3.2.7 Hierarchische Properties
208
3.2.8 Besondere Datentypen abbilden
213
3.2.9 Relaxed Bindings
220
3.2.10 Property-Sources
221
3.2.11 Spring-Profile definieren
234
3.2.12 Profile aktivieren
237
3.2.13 Spring-managed Beans je nach Profil
239
3.3 Am Anfang und Ende
241
3.3.1 CommandLineRunner und ApplicationRunner
242
3.3.2 Am Ende der Anwendung
244
3.3.3 Java-Programme mit Exit-Code beenden *
245
3.4 Ereignisbehandlung
251
3.4.1 Beteiligte Objekte
251
3.4.2 Context Events
251
3.4.3 ApplicationListener
253
3.4.4 @EventListener
254
3.4.5 Methoden der Ereignisklassen
254
3.4.6 Ereignisklassen schreiben und auf die Ereignisse reagieren
255
3.4.7 Ein Eventbus vom Typ ApplicationEventPublisher
256
3.4.8 Generische Ereignisse am Beispiel von PayloadApplicationEvent
257
3.4.9 Ereignistransformationen
260
3.4.10 Reihenfolgen durch @Order
260
3.4.11 Ereignisse nach Bedingungen filtern
261
3.4.12 Ereignisse synchron und asynchron
262
3.4.13 ApplicationEventMulticaster *
262
3.4.14 Ereignisse über ApplicationContext versenden
264
3.4.15 Listener an SpringApplication hängen *
264
3.4.16 Listener deklarativ registrieren *
265
3.5 Ressourcenabstraktion mit Resource
266
3.5.1 InputStreamSource und Resource
267
3.5.2 Ressourcen laden
269
3.5.3 Ressourcen über @Value injizieren
269
3.6 Typkonvertierung mit ConversionService
271
3.6.1 ConversionService
271
3.6.2 DefaultConversionService und ApplicationConversionService
272
3.6.3 ConversionService als Spring-managed Bean
274
3.6.4 Bei der ConverterRegistry eigene Konverter anmelden
276
3.6.5 Printer und Parser
281
3.6.6 FormatterRegistry
283
3.6.7 DataBinder
285
3.7 Internationalisierung *
289
3.7.1 Möglichkeiten zur Internationalisierung mit der Java SE
289
3.7.2 MessageSource unter Untertypen
291
3.8 Scheduling *
295
3.8.1 Scheduling-Annotationen und @EnableScheduling
296
3.8.2 @Scheduled
296
3.8.3 Nachteile von @Scheduled und Alternativen
299
3.9 Typen aus org.springframework.*.[lang|util]
300
3.9.1 Das Paket org.springframework.util
300
3.9.2 Das Paket org.springframework.data.util
302
3.10 JSpecify-Null-Annotationen in Spring
306
3.10.1 JSpecify
306
4 Testgetriebene Entwicklung mit Spring Boot
309
4.1 Grundlagen der testgetriebenen Entwicklung
309
4.1.1 Testbezogene Einträge vom Spring Initializr
309
4.1.2 Annotation @Test
310
4.1.3 Testfall für einen Thumbnail-Generator
310
4.1.4 Testfall für die Klasse »FileSystem«
313
4.1.5 Mehrschichtige Anwendungen testen, Objekte austauschen
316
4.2 Testen mit Mock-Objekten
319
4.2.1 Das Mocking-Framework Mockito
320
4.2.2 @InjectMocks
323
4.2.3 Verhalten verifizieren
324
4.2.4 Testen mit ReflectionTestUtils
325
4.2.5 Mocken von Spring-Datentypen
327
4.3 Testen mit Spring-Unterstützung
328
4.3.1 Die Annotation @SpringBootTest
328
4.3.2 @TestPropertySource
332
4.3.3 @ActiveProfiles
334
4.3.4 Dependency-Injection in Spring-Testklassen
334
4.3.5 Stellvertreter einsetzen
336
4.3.6 @DirtiesContext
339
5 Ausgewählte Proxies
341
5.1 Proxy-Pattern
342
5.1.1 Proxy-Einsatz in Spring
343
5.1.2 Proxies dynamisch generieren
345
5.2 Caching
346
5.2.1 Optimierung durch Caching
347
5.2.2 Caching in Spring
347
5.2.3 Komponente mit @Cacheable implementieren
348
5.2.4 @Cacheable-Proxy nutzen
350
5.2.5 @Cacheable + condition
352
5.2.6 @Cacheable + unless
353
5.2.7 @CachePut
354
5.2.8 @CacheEvict
354
5.2.9 Eigene Schlüsselgeneratoren angeben
355
5.2.10 @CacheConfig
362
5.2.11 Cache-Implementierungen
363
5.2.12 Caching mit Caffeine
364
5.2.13 Das Caching im Test abschalten
365
5.3 Asynchrone Aufrufe
366
5.3.1 @EnableAsync und @Async-Methoden
366
5.3.2 Beispiel mit @Async
367
5.3.3 Der Rückgabetyp CompletableFuture
370
5.4 TaskExecutor *
374
5.4.1 TaskExecutor-Implementierungen
375
5.4.2 Executor setzen und Ausnahmen behandeln
377
5.5 Spring und Bean Validation
380
5.5.1 Parameterprüfungen
380
5.5.2 Der Standard Jakarta Bean Validation
381
5.5.3 Dependency auf die Spring-Boot-Starter-Validation
381
5.5.4 »Photo« mit Jakarta-Bean-Validation-Annotationen
382
5.5.5 Einen Validator injizieren und prüfen
383
5.5.6 Spring und die Bean-Validation-Annotationen
386
5.5.7 Bean-Validation-Annotationen an Methoden
388
5.5.8 Validierung überall, am Beispiel einer Konfiguration
388
5.5.9 Refactoring der Photo-Klasse
390
6 Relationale Datenbanken anbinden
393
6.1 Eine H2-Datenbank aufsetzen
393
6.1.1 Kurzvorstellung der H2-Datenbank
393
6.1.2 H2 installieren und starten
394
6.1.3 Über die H2 Console eine Verbindung zur Datenbank aufbauen
397
6.1.4 Das Datenbankschema der Date4u-Datenbank
399
6.2 Datenbankzugriffe mit Spring realisieren
402
6.2.1 Spring-Helfer
402
6.3 Der Spring Boot Starter JDBC
404
6.3.1 Den JDBC-Starter in die POM aufnehmen
404
6.3.2 JDBC-Verbindungsdaten eintragen
405
6.3.3 DataSource oder JdbcTemplate injizieren
405
6.3.4 Connection-Pooling
408
6.3.5 Das Paket org.springframework.jdbc und seine Unterpakete
410
6.3.6 DataAccessException
410
6.3.7 Autokonfiguration für DataSource *
412
6.3.8 Mehrere Datenbanken ansprechen
413
6.3.9 DataSourceUtils *
416
6.4 JdbcTemplate
417
6.4.1 Beliebiges SQL ausführen: execute(…)
417
6.4.2 SQL-Aktualisierungen: update(…)
418
6.4.3 Einzelne Werte erfragen: queryForObject(…)
418
6.4.4 Einen Platzhalter für ein PreparedStatement definieren
419
6.4.5 Ganze Zeile erfragen: queryForMap(…)
420
6.4.6 Mehrere Zeilen mit einem Element erfragen: queryForList(…)
421
6.4.7 Mehrere Zeilen und Spalten einlesen: queryForList(…)
422
6.5 Datentypen zum Mapping auf Ergebnisse
423
6.5.1 RowMapper
424
6.5.2 RowCallbackHandler
429
6.5.3 ResultSetExtractor
430
6.6 NamedParameterJdbcTemplate
434
6.6.1 Typbeziehungen von *JdbcTemplate
435
6.6.2 Methoden vom NamedParameterJdbcTemplate
435
6.6.3 Werte von NamedParameterJdbcTemplate mit Map übergeben
436
6.6.4 SqlParameterSource
436
6.6.5 Rückgriff auf tiefer liegende Objekte *
439
6.7 Batch-Operationen *
440
6.7.1 Batch-Methoden beim JdbcTemplate
440
6.7.2 BatchPreparedStatementSetter
441
6.7.3 Batch-Methoden beim NamedParameterJdbcTemplate
446
6.7.4 SqlParameterSourceUtils
447
6.7.5 Konfigurations-Properties
448
6.8 Es wird groß mit BLOB und CLOB *
449
6.8.1 LOBs lesen
449
6.8.2 LOBs schreiben
449
6.9 Das Paket org.springframework.jdbc.core.simple *
450
6.9.1 JdbcClient
450
6.9.2 SimpleJdbcInsert
455
6.10 Das Paket org.springframework.jdbc.object *
457
6.10.1 MappingSqlQuery
458
6.11 Transaktionen
460
6.11.1 Das ACID-Prinzip
460
6.11.2 Lokal oder global/verteilt
460
6.11.3 JDBC-Transaktionen/Auto-Commit
461
6.11.4 PlatformTransactionManager
462
6.11.5 TransactionTemplate
466
6.11.6 @Transactional
471
7 Jakarta Persistence mit Spring
475
7.1 Welt der Objekte und der Datenbanken
475
7.1.1 Transient und persistent
476
7.1.2 Abbildung von Objekten auf Tabellen
476
7.1.3 Java-Bibliotheken für das O/R-Mapping
480
7.2 Jakarta Persistence
481
7.2.1 Persistence Provider
482
7.2.2 Jakarta Persistence Provider nutzen JDBC
483
7.2.3 Was deckt die Jakarta Persistence ab?
483
7.3 Spring Data JPA
484
7.3.1 Spring Boot Starter Data JPA einbinden
484
7.3.2 Konfigurationen
485
7.4 Die Jakarta-Persistence-Entity-Bean
487
7.4.1 Eine Entity-Bean-Klasse entwickeln
488
7.5 Die Jakarta Persistence API
494
7.5.1 Den EntityManager von Spring bekommen
495
7.5.2 Eine Entity-Bean über ihren Schlüssel suchen: find(…)
497
7.5.3 find(…) und getReference(…)
499
7.5.4 Abfragemöglichkeiten mit dem EntityManager
500
7.6 Die Jakarta Persistence Query Language (JPQL)
501
7.6.1 Ein JPQL-Beispiel mit SELECT und FROM
501
7.6.2 JPQL-Abfragen mit createQuery(…) aufbauen und absenden
503
7.6.3 Bedingungen in WHERE
506
7.6.4 JPQL-Aufrufe parametrisieren
507
7.6.5 JPQL-Operatoren und -Funktionen
510
7.6.6 Rückgaben ordnen mit ORDER BY
514
7.6.7 Projektion auf skalare Werte
515
7.6.8 Aggregatfunktionen
516
7.6.9 Projektion auf mehrere Werte
517
7.6.10 Benannte deklarative Abfragen (Named Queries)
521
7.7 Datenbankfunktionen aufrufen und native SQL-Abfragen senden
523
7.7.1 Datenbankfunktionen aufrufen: FUNCTION(…)
524
7.7.2 createNativeQuery(…) über EntityManager nutzen
524
7.7.3 @NamedNativeQuery
526
7.7.4 @NamedNativeQuery mit resultSetMapping
527
7.8 Schreibender Zugriff mit dem EntityManager in Transaktionen
530
7.8.1 Transaktionale Operationen
530
7.8.2 persist(…)
531
7.8.3 EntityTransaction
531
7.8.4 PlatformTransactionManager → JpaTransactionManager
532
7.8.5 @Transactional
534
7.8.6 Speichern vs. Aktualisieren
535
7.8.7 remove(…)
535
7.8.8 Synchronisation bzw. Flush
536
7.8.9 Query mit UPDATE und DELETE
536
7.9 Persistence Context und weitere Transaktionssteuerungen
537
7.9.1 Die Jakarta Persistence API und Datenbankoperationen
537
7.9.2 Zustände einer Entity-Bean
538
7.10 Weiterführende O/R-Metadaten
542
7.10.1 Der Database-first- und der Code-first-Ansatz
542
7.10.2 Den Tabellennamen über @Table setzen
543
7.10.3 Den @Entity-Namen ändern
544
7.10.4 Persistente Attribute
544
7.10.5 @Basic und @Transient
546
7.10.6 Spaltenbeschreibung und @Column
546
7.10.7 Entity-Bean-Datentypen
549
7.10.8 Datentypen mit AttributeConverter mappen
552
7.10.9 Schlüsselkennzeichnung
554
7.10.10 Eingebettete Typen
559
7.10.11 Eine Entity-Bean erbt Eigenschaften von einer Oberklasse
561
7.11 Beziehungen zwischen Entitäten
563
7.11.1 Unterstützte Assoziationen und Beziehungstypen
563
7.11.2 Die 1:1-Beziehung
564
7.11.3 Bidirektionale Beziehungen
568
7.11.4 Die 1:n-Beziehung
569
7.11.5 n:m-Beziehungen *
575
7.12 FetchType: Lazy und Eager Loading
577
7.12.1 Aufzählung mit FetchType
577
7.12.2 Der Hibernate-Typ PersistentBag
578
7.12.3 Das 1+N-Query-Problem ist ein Performance-Antipattern
580
7.13 Cascading
582
7.13.1 Kaskadierung
583
7.13.2 Der Aufzählungstyp CascadeType
583
7.13.3 CascadeType setzen
585
7.13.4 cascade=REMOVE vs. orphanRemoval=true
587
7.14 Repositories
587
7.14.1 Datenzugriffsschicht
588
7.14.2 Methoden im Repository
590
7.14.3 SimpleJpaRepository
592
8 Spring Data JPA
597
8.1 Welche Aufgaben erfüllt Spring Data?
597
8.1.1 Für welche Systeme gibt es Spring Data?
598
8.2 Spring Data Commons: CrudRepository
599
8.2.1 Der Typ CrudRepository
600
8.2.2 JPA-basierte Repositories
601
8.3 Untertypen von CrudRepository: JpaRepository usw.
605
8.3.1 ListCrudRepository
605
8.3.2 Technologiespezifische [List]CrudRepository-Untertypen
605
8.3.3 Ausgewählte Methoden über Repository
608
8.4 Blättern und Sortieren mit [List]PagingAndSortingRepository
609
8.4.1 JpaRepository: Untertyp von ListPagingAndSortingRepository und ListCrudRepository
610
8.4.2 Der Typ Sort
611
8.4.3 Sort.TypedSort<T>
612
8.4.4 Pageable und PageRequest
613
8.4.5 Sortieren von paginierten Seiten
619
8.4.6 Performanceüberlegungen
619
8.5 QueryByExampleExecutor *
620
8.5.1 Die Probe
621
8.5.2 QueryByExampleExecutor nutzen
621
8.5.3 Probe in das Example
622
8.5.4 ExampleMatcher aufbauen
623
8.5.5 Properties ignorieren
624
8.5.6 String-Vergleiche mit ExampleMatcher steuern
624
8.5.7 Bewertung von Query-By-Example (QBE)
625
8.6 Eigene Abfragen mit @Query formulieren
626
8.6.1 Die @Query-Annotation
626
8.6.2 Verändernde @Query-Operationen mit @Modifying
628
8.6.3 IN-Parameter durch Array/Vararg/Collection füllen
628
8.6.4 @Query mit JPQL-Projektion
629
8.6.5 Sort- und Pageable-Parameter
630
8.6.6 Neue Query-Methoden ergänzen
631
8.6.7 Queries mit SpEL-Ausdrücken
632
8.6.8 Die @NamedQuery einer Entity-Bean verwenden
633
8.6.9 Die @Query-Annotation mit nativem SQL
634
8.7 Stored Procedures (gespeicherte Prozeduren) *
636
8.7.1 Eine gespeicherte Prozedur in H2 definieren
637
8.7.2 Eine gespeicherte Prozedur über eine native Query aufrufen
639
8.7.3 Eine gespeicherte Prozedur mit @Procedure aufrufen
639
8.8 Derived Query Methods
640
8.8.1 Individuelle CRUD-Operationen über Methodennamen
640
8.8.2 Aufbau der Derived Query Methods
641
8.8.3 Rückgaben von Derived Query Methods
645
8.8.4 Asynchrone Query-Methoden
646
8.8.5 Streamende Query-Methoden
646
8.8.6 Vorteile und Nachteile der Derived Query Methods
646
8.9 Die Criteria API und der JpaSpecificationExecutor
647
8.9.1 Die Criteria API
649
8.9.2 PredicateSpecification, Specification und die vereinfachten Spezifikationen
649
8.9.3 JpaSpecificationExecutor
650
8.9.4 Methoden in JpaSpecificationExecutor
651
8.9.5 Einfache PredicateSpecification-Implementierungen
652
8.9.6 Spezifikationen zusammensetzen
654
8.9.7 Query-gebundene Varianten: Specification, UpdateSpecification, DeleteSpecification
655
8.9.8 findBy(..., queryFunction) und die Fluent-API
655
8.9.9 Metamodellklassen
656
8.9.10 Nachteile der Criteria API
658
8.10 Alternativen zu JDBC und Jakarta Persistence
659
8.10.1 Querydsl
660
8.10.2 Spring Data JDBC
668
8.11 Gutes Design mit Repositories
673
8.11.1 Abstraktionen durch die Zwiebelarchitektur
674
8.11.2 Denke an ISP und die Zwiebel!
675
8.11.3 Das Fragment-Interface
677
8.12 Projektionen
678
8.12.1 Projektionen selbst durchführen
679
8.12.2 Projektionen in Spring Data
679
8.12.3 Die Interface-basierte Projektion
679
8.12.4 Projektionen mit SpEL-Ausdrücken
681
8.12.5 Projektionen mit Default-Methoden
682
8.12.6 Klassenbasierte Projektionen
683
8.12.7 Dynamische Projektionen
683
8.13 [Fetchable]FluentQuery *
685
8.14 Auditing *
687
8.14.1 Auditing mit Spring Data
687
8.14.2 Auditing mit Spring Data JPA
687
8.14.3 AuditorAware für User-Informationen
689
8.14.4 Ausblick: Spring Data Envers
690
8.15 Incremental Data Migration
691
8.15.1 Lang leben die Daten
691
8.15.2 Evolutionäres Datenbankdesign
691
8.15.3 Incremental Data Migration mit Flyway
692
8.15.4 Flyway in Spring Boot: Migrationsskripte
693
8.15.5 Migrationen in Java-Code
695
8.15.6 Flyway-Migrationen außerhalb von Spring
697
8.16 Die Datenzugriffsschicht testen
697
8.16.1 Was wollen wir testen?
697
8.16.2 Testscheibchen
698
8.16.3 Eine In-Memory-Testdatenbank einsetzen
700
8.16.4 Eigene Verbindungsdaten zur Testdatenbank zuweisen
701
8.16.5 Tabellen aufbauen mit Initialisierungsskripten
702
8.16.6 Das Projekt Testcontainers
703
8.16.7 Demodaten
706
8.16.8 @Sql und @SqlGroup
707
8.16.9 TestEntityManager
707
9 Spring Data für NoSQL-Datenbanken
709
9.1 Not only SQL
709
9.2 MongoDB
710
9.2.1 MongoDB: Dokumente und Collections
710
9.2.2 Über MongoDB
711
9.2.3 Den MongoDB Community Server installieren und starten
712
9.2.4 GUI-Werkzeuge für MongoDB
714
9.2.5 Spring Data MongoDB
714
9.2.6 MongoDB-APIs
716
9.2.7 MongoDB-Dokumente
716
9.2.8 Die Klasse MongoTemplate
718
9.2.9 MongoDB-Repositories
720
9.2.10 MongoDB-Programme testen
723
10 Spring Web
725
10.1 Webserver
725
10.1.1 Java-Webserver
726
10.1.2 Spring Boot Starter Web MVC
727
10.1.3 Andere Webserver einsetzen *
728
10.1.4 Port anpassen über server.port
729
10.1.5 Statische Ressourcen servieren
729
10.1.6 WebJars
730
10.1.7 TLS-Verschlüsselung
731
10.2 Dynamische Inhalte generieren
732
10.2.1 Steinzeit: Das Common Gateway Interface (CGI)
732
10.2.2 Der Servlet-Standard
734
10.2.3 @WebServlet programmieren
735
10.2.4 Schwächen von Servlets
736
10.3 Spring Web MVC
737
10.3.1 Spring-Container in Webanwendungen
738
10.3.2 @Controller und @ResponseBody
739
10.3.3 @RestController
740
10.3.4 Controller → [Service →] Repository
743
10.4 Hot Code Swapping
744
10.4.1 Hot Swapping der JVM
744
10.4.2 Spring Developer Tools
744
10.5 Das Hypertext Transfer Protocol (HTTP)
745
10.5.1 HTTP-Request und -Response
745
10.5.2 Einen HTTP-Client zum Testen von Anwendungen aufsetzen
747
10.6 Request Matching
748
10.6.1 @RequestMapping
748
10.6.2 @*Mapping
748
10.6.3 Allgemeinere Pfadausdrücke und Path-Matcher
749
10.6.4 @RequestMapping am Typ
749
10.7 Response senden
751
10.7.1 HttpMessageConverter in der Anwendung
751
10.7.2 Formatkonvertierungen der Rückgaben von Handler-Methoden
752
10.7.3 Abbildung auf JSON-Dokumente
752
10.7.4 HTTP-Statuscode und @ResponseStatus
759
10.7.5 ResponseEntity = Statuscode + Header + Body
762
10.8 Request auswerten
763
10.8.1 Handler-Methoden mit Parametern
763
10.8.2 Datenübertragung vom Client zum Controller
764
10.8.3 Datenannahme über Parameter
765
10.8.4 Query-Parameter auswerten
765
10.8.5 Optionale Query-Parameter
767
10.8.6 Alle Query-Parameter mappen
768
10.8.7 Eine Pfadvariable auswerten
770
10.8.8 REST-Endpunkte für Profile implementieren
773
10.8.9 Data Transfer Objects (DTO)
776
10.8.10 POST und PUT mit @RequestBody
781
10.8.11 UriComponents
784
10.8.12 MultipartFile
785
10.8.13 Header auswerten
787
10.8.14 HttpEntity mit ihren Unterklassen RequestEntity und ResponseEntity *
788
10.9 Typkonvertierung der Parameter
789
10.9.1 Beispiel für YearMonth-Converter
789
10.9.2 @DateTimeFormat und @NumberFormat
790
10.9.3 Query-Parameter und Formulardaten auf eine Bean mappen
791
10.9.4 Eigene Typkonverter anmelden
794
10.9.5 URI-Template-Pattern mit regulären Ausdrücken
797
10.10 Ausnahmebehandlung und Fehlermeldung
798
10.10.1 Ausnahmen selbst auf Statuscodes mappen
798
10.10.2 Eskaliert
798
10.10.3 Die Konfigurations-Properties spring.web.error.*
800
10.10.4 Exception-Resolver
803
10.10.5 Exception auf Statuscode mit @ResponseStatus mappen
804
10.10.6 ResponseStatusException
805
10.10.7 Lokales Controller-Exception-Handling mit @ExceptionHandler
807
10.10.8 »Problem Details for HTTP APIs«
809
10.10.9 Globales Controller-Exception-Handling mit Controller-Advice
812
10.11 Webservices und RESTful API
813
10.11.1 Die Prinzipien hinter REST
813
10.12 GraphQL
816
10.12.1 Das Problem mit traditionellen REST-APIs
817
10.12.2 GraphQL-Schema und Datentypen
818
10.12.3 Spring GraphQL
820
10.12.4 Erstellen eines einfachen GraphQL-Schemas
820
10.12.5 Implementierung eines Data-Fetchers
821
10.12.6 GraphQL-Abfrage
821
10.12.7 Testumgebung GraphiQL
822
10.12.8 GraphQL-Ergebnis
823
10.12.9 Data Fetcher über Handler-Methoden
824
10.12.10 Ein komplexeres GraphQL-Schema umsetzen
825
10.12.11 Assoziationen und Schema-Mappings
836
10.12.12 Validierung
838
10.12.13 CORS (Cross-Origin Resource Sharing)
839
10.12.14 GraphQL-JavaScript-Client
839
10.12.15 Spring GraphQL Client
840
10.12.16 Ausblick und Fazit
843
10.13 Asynchrone Web-Requests *
845
10.13.1 Lange Abfragen blockieren den Worker-Thread
845
10.13.2 Asynchrone Antworttechniken in Spring MVC
846
10.13.3 Eine Handler-Methode liefert Callable
846
10.13.4 WebAsyncTask
847
10.13.5 Eine Handler-Methode liefert DeferredResult
847
10.13.6 StreamingResponseBody
848
10.14 Spring Data Web Support
849
10.14.1 Laden aus dem Repository
849
10.14.2 Pageable und Sort als Parametertypen
850
10.14.3 Die Rückgabe Page und PagedModel
853
10.14.4 Payload-Verarbeitung mit Projektionen
854
10.14.5 Querydsl Predicate als Parametertyp
854
10.15 Dokumentation einer RESTful API mit OpenAPI
856
10.15.1 Beschreibung einer RESTful API
856
10.15.2 Die OpenAPI-Spezifikation
857
10.15.3 Woher kommt das OpenAPI-Dokument?
858
10.15.4 OpenAPI mit Spring
858
10.15.5 springdoc-openapi
859
10.15.6 Bessere Dokumentation mit OpenAPI-Annotationen
861
10.15.7 Java-Code aus einem OpenAPI-Dokument generieren
862
10.15.8 Spring REST Docs
865
10.16 Testen der Webschicht
866
10.16.1 QuoteRestController testen
866
10.16.2 Die Annotation @WebMvcTest
868
10.16.3 Eine Testmethode mit MockMvc schreiben
869
10.16.4 REST-Endpunkte mit dem Server testen
874
10.16.5 RestTestClient
874
10.17 Best Practices bei der Nutzung einer RESTful API
876
10.17.1 Jakarta Bean Validation
876
10.17.2 Ressourcen-ID
878
10.17.3 Data Transfer Objects (DTO) mit MapStruct mappen
878
10.17.4 Versionierung von RESTful Webservices
881
10.18 Webanwendungen mit Spring Security absichern
883
10.18.1 Die Bedeutung von Spring Security
883
10.18.2 Dependency auf Spring Boot Starter Security
883
10.18.3 Authentication
884
10.18.4 SecurityContext und SecurityContextHolder
885
10.18.5 AuthenticationManager
887
10.18.6 SpringBootWebSecurityConfiguration
889
10.18.7 AuthenticationManager und ProviderManager
891
10.18.8 Die Schnittstelle UserDetailsService
892
10.18.9 PasswordEncoder
897
10.18.10 BasicAuthenticationFilter
901
10.18.11 Zugriff auf den Benutzer
902
10.18.12 Authorization und das Cookie
903
10.18.13 Tokenbasierte Authentifizierung mit JWT
904
10.19 RESTful Webservices konsumieren
913
10.19.1 Klassen zum Ansprechen von HTTP-Endpunkten
913
10.19.2 RestClient API
914
10.19.3 WebClient API
920
10.19.4 Deklarative Webservice-Clients
925
11 Spring AI
931
11.1 Was ist künstliche Intelligenz?
931
11.1.1 KI-Modelle
931
11.1.2 Verschiedene KI-Modelle
932
11.1.3 Lokale Modelle und Remote-Modelle
932
11.1.4 Freie Modelle
932
11.2 Ollama
933
11.2.1 Ollama installieren
934
11.2.2 Modelle installieren
934
11.2.3 Sprachmodelle nutzen
935
11.3 KI-Modelle in Java-Programmen integrieren
935
11.4 Spring AI nutzen
936
11.4.1 Spring Boot Starter für Spring AI
937
11.4.2 Spring AI Ollama Spring Boot Starter
937
11.4.3 ChatClient und ChatClient.Builder
938
11.4.4 ChatClient ohne Autokonfiguration
939
11.5 Prompt aufbauen
940
11.5.1 Ergebnis abrufen
941
11.5.2 ChatResponse
942
11.5.3 Generation
942
11.6 Nachrichtenmodell und Prompt-Struktur
943
11.6.1 Das Message-Konzept
943
11.6.2 Rollenmodell (MessageType)
943
11.6.3 Prompt als strukturierte Nachrichtensammlung
945
11.6.4 Konstruktion von Message-Objekten
946
11.6.5 Multimodale Verarbeitung
946
11.6.6 Template-basierte Prompts
947
11.7 Strukturierte Ausgaben und Objekt-Mapping
948
11.7.1 Mapping auf Java-Objekte
948
11.7.2 Integration in den Prompt
949
11.7.3 Vereinfachtes Mapping über entity(...)
950
11.7.4 Zwei Strategien für strukturierte Ausgaben
950
11.8 Zugriff auf aktuelle und lokale Daten
951
11.8.1 Tool Calling
952
11.8.2 Tools in Spring AI definieren
953
11.8.3 Registrierung von Tools
954
11.9 Advisors
958
11.9.1 Registrierung von Advisors
959
11.9.2 SimpleLoggerAdvisor
960
11.9.3 Guardrails als Advisors
961
11.10 Verwaltung von Konversationskontext mit ChatMemory
962
11.10.1 Trennung von Strategie und Persistenz: ChatMemoryRepository
962
11.10.2 Integration in den Anfragefluss über Advisors
963
11.11 Vektoren, Embeddings und semantische Suche
965
11.11.1 Embedding-Modelle
965
11.11.2 Vektordatenbanken
966
11.11.3 Dokumente als Trägereinheit
967
11.11.4 VectorStore als gemeinsame Schnittstelle
967
11.11.5 ETL-Pipeline zur Datenaufbereitung
969
11.11.6 Retrieval-Augmented Generation (RAG)
970
11.12 Ausblick
971
12 Logging und Monitoring
973
12.1 Logging
973
12.1.1 Warum ein Protokoll erstellen?
973
12.1.2 Log-Group
974
12.2 Logging-Implementierung
974
12.2.1 Umstellung auf log4j2
975
12.2.2 Das Logging-Pattern-Layout
976
12.2.3 Die Logging-Konfiguration ändern
977
12.2.4 JSON-Logging in Spring Boot
977
12.2.5 MDC (Mapped Diagnostic Context)
979
12.2.6 Banner
980
12.2.7 Logging zur Startzeit
981
12.2.8 Testen von geschriebener Log-Meldung
981
12.3 Anwendungen mit dem Spring Boot Actuator überwachen
982
12.3.1 Den Gesundheitszustand über den Actuator ermitteln
983
12.3.2 Aktivierung der Endpunkte
984
12.3.3 Info-Ergänzungen
985
12.3.4 Parameter und JSON-Rückgaben
986
12.3.5 Neue Actuator-Endpunkte
988
12.3.6 Bin ich gesund?
988
12.3.7 HealthIndicator
990
12.3.8 Metriken
990
12.4 Micrometer und Prometheus
991
12.4.1 Micrometer
992
12.4.2 Prometheus: Die Software
995
13 Build und Deployment
999
13.1 Spring-Boot-Programme verpacken und ausführen
999
13.1.1 Deployment-Optionen
999
13.1.2 Ein Spring-Boot-Programm über Maven starten
1000
13.1.3 Ein Spring-Boot-Programm in JAR packen
1000
13.1.4 Das spring-boot-maven-plugin
1001
13.2 Spring-Anwendungen im OCI-Container
1002
13.2.1 Container
1003
13.2.2 Docker installieren und nutzen
1004
13.2.3 H2 starten, stoppen, Port-Weiterleitung und Data-Volumes
1007
13.2.4 Eine Spring-Boot-Docker-Anwendung vorbereiten
1009
13.2.5 Docker Compose
1012
13.2.6 Anwendungen beenden mit einem Actuator-Endpunkt
1013
Index
1015