Kurs Java

Zmiany w Spring Boot 2.3 do 2.5

W oczekiwaniu na Spring Boot-a w wersji 2.6 GA przygotowaliśmy podsumowanie najważniejszych zmian, jakie dokonały się w trzech ostatnich wersjach tego projektu. Niektóre z nich mogą powodować, że nasz zaimplementowany wcześniej kod albo w ogóle przestanie działać, albo też zacznie zachowywać się w nieoczekiwany sposób. Wszystkie tego typu zmiany zostały dodatkowo oznaczone za pomocą naszej notki.

Spring Boot 2.3 - Maj 2020

  • Java 14 - Spring Boot 2.3 dodaje obsługę Java 14. Obsługiwane są również Java 8 i 11.
  • Pakiet validation nie jest już zawarty w web starterach

    Dawniej pakiet javax.validation.* był częścią spring-boot-starter-web, ale został wydzielony do startera spring-boot-starter-validation. Tak więc, jeśli chcemy używać w aplikacji Spring Boota w wersji co najmniej 2.3.0, a w projekcie używaliśmy pakietu walidacyjnego javax.validation.* (na przykład adnotacji @Valid), należy do projektu podpiąć starter spring-boot-starter-validation:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    
    Appa Notka. W przypadku gdy używałeś walidatorów ze wspomnianego pakietu, jeśli nie wykonasz tej zmiany, Twój kod przestanie się kompilować.
  • Adnotacja @ActiveProfiles - aktywacja wielu profili vs jeden profil z przecinkami

    Obecnie nazwy profili zawierające przecinki są już obsługiwane przez adnotację @ActiveProfiles. Oznacza to, że adnotacja taka jak @ActiveProfiles("p1,p2") będzie traktować podaną wartość p1,p2 jako pojedynczą nazwę profilu! Dlatego jeśli naszym celem jest aktywacja wielu profili, należy podać nazwę każdego profilu jako oddzielną wartość, czyli @ActiveProfiles({"p1","p2"}).
  • "Graceful shutdown"

    Bardziej eleganckie (w dosłownym tłumaczeniu — wdzięczne) zamykanie we wszystkich czterech wbudowanych webserverach (Jetty, Reactor Netty, Tomcat i Undertow) oraz w aplikacjach webowych zarówno reaktywnych, jak i opartych na serwletach. Po włączeniu opcji server.shutdown=graceful, jeśli webserver został już wyłączony, nie będzie on zezwalał na nowe żądania. Takie zachowanie spowoduje, że nie będą się pojawiać błędy przy próbie wysyłania nowych requestów do wyłączonego już webservera. Równocześnie serwer oczywiście pozwoli na zakończenie aktywnych żądań. Czas oczekiwania na ich dokończenie można skonfigurować za pomocą spring.lifecycle.timeout-per-shutdown-phase.
  • Spring Data Neumann

    Spring Boot 2.3 jest dostarczany z główną wersją Spring Data o nazwie Spring Data Neumann (przechodzi na GA).
  • Konwersja czasu i daty

    Od teraz konwersję wartości czasu i daty w aplikacjach webowych można konfigurować za pomocą pliku konfiguracyjnego. W przypadku MVC służą do tego właściwości spring.mvc.format.time i spring.mvc.format.date-time. W WebFlux właściwościami tymi są odpowiednio spring.webflux.format.time i spring.webflux.format.date-time.

Spring Boot 2.4 - Listopad 2020

  • Java 15 - Spring Boot 2.4 dodaje obsługę Java 15 i używa Spring Framework 5.3. Minimalną wspieraną wersją pozostaje Java 8.
  • Przetwarzanie plików konfiguracyjnych — Config File Processing (application properties, YAML files)

    Spring Boot 2.4 zmienił sposób przetwarzania plików application.properties i application.yml. W przypadku prostych plików uaktualnienie powinno przebiegać bezproblemowo. Jeśli jednak mamy bardziej złożoną konfigurację (z właściwościami specyficznymi dla profilu lub właściwościami aktywacji profilu), może być konieczne wprowadzenie pewnych zmian. To jest o tyle istotne, że nasza "stara" konfiguracja profili przestanie działać. Przykładowo, jeśli do tej pory konfigurowaliśmy profile tak:
    spring:
        profiles: "prod"
    secret: "production-password"
    
    , teraz należy ją zmigrować do poniższego schematu:
    spring:
        config:
            activate:
                on-profile: "prod"
    secret: "production-password"
    
    Natomiast jeśli nie chcemy narazić się na niespodzianki, możemy ustawić właściwość spring.config.use-legacy-processing na true w pliku application.properties lub application.yml i wtedy pliki będą traktowane tak jak w Spring Boot 2.3.

    Warto jeszcze zerknąć na stronę: https://github-wiki-see.page/m/spring-projects/spring-boot/wiki/Spring-Boot-Config-Data-Migration-Guide
    Appa Notka. To jest bardzo poważna sprawa, ponieważ zmiana własności aktywującej profile nie objawi się ani problemem kompilacji, ani żadnym rzucającym się w oczy błędem. Po prostu dotychczas używane profile przestaną się zaczytywać i może upłynąć trochę czasu, zanim zorientujesz się, dlaczego dobrze działający system nagle popadł w tarapaty. Na przykład klasy uzależnione od konkretnego profilu nie zostaną zaczytane i funkcjonalność, która działała od lat, niespodziewanie przestanie działać w ogóle.
  • Stary silnik JUnit 5 został usunięty ze startera spring-boot-starter-test

    Silnik vintage umożliwiał uruchamianie testów napisanych za pomocą JUnit 4 przez JUnit 5. Jeśli nie chcesz migrować swoich testów do JUnit 5 i chcesz nadal używać JUnit 4, dodaj zależność do junit-vintage-engine:
    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.hamcrest</groupId>
                <artifactId>hamcrest-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
    Appa Notka. W przeciwnym wypadku zobaczysz błędy kompilacji testów dla klas JUnit, takich jak org.junit.Test.
  • Wykrywanie wbudowanej bazy danych (H2, HSQL, Derby)

    Logika osadzonej bazy danych została udoskonalona tak, aby traktować bazę danych jako osadzoną tylko wtedy, gdy znajduje się ona w pamięci. W przypadku gdy używasz trwałości opartej na plikach lub w trybie serwera, ta zmiana ma dwie konsekwencje.
    • Nazwa użytkownika sa nie będzie już ustawiana. Należy ustawić ją za pomocą właściwości konfiguracyjnej:
      spring.datasource.username=sa
      
    • Takie bazy danych nie będą już inicjowane podczas uruchamiania, ponieważ nie są uważane za osadzone. Można to dostroić, używając własności:
      spring.datasource.initialization-mode
      
  • Nowe właściwości konfiguracyjne Logback-a

    Właściwości logowania specyficzne dla Logback-a, zostały zmienione, aby odzwierciedlić fakt, że pochodzą właśnie od niego. Poprzednie nazwy zostały wycofane:
    logging.pattern.rolling-file-name → logging.logback.rollingpolicy.file-name-pattern
    logging.file.clean-history-on-start → logging.logback.rollingpolicy.clean-history-on-start
    logging.file.max-size → logging.logback.rollingpolicy.max-file-size
    logging.file.total-size-cap → logging.logback.rollingpolicy.total-size-cap
    logging.file.max-history → logging.logback.rollingpolicy.max-history
    
    Appa Notka. Należy to zaktualizować w projekcie, aby nasze ustawienia nadal były poprawnie odczytywane. Inaczej mogą one przestać działać.

Spring Boot 2.5 - Maj 2021

  • Java 16 - Spring Boot 2.5 zapewnia wsparcie pod kątem zgodności z Java 16. Pozostaje również kompatybilny z Java 8.
  • Inicjalizacja źródła danych ze skryptu SQL

    W Spring Boot 2.5 podstawowa metoda obsługi skryptów schema.sql i data.sql została przeprojektowana. Właściwości spring.datasource.* związane z inicjalizacją DataSource zostały zastąpione nowymi właściwościami spring.sql.init.*. Te właściwości mogą być również używane do inicjowania bazy danych SQL w ramach R2DBC.

    Domyślnie skrypty data.sql są teraz uruchamiane przed zainicjowaniem Hibernate. Dopasowuje to zachowanie podstawowej inicjalizacji opartej na skrypcie do zachowania reprezentowanego przez Flyway i Liquibase. Jeśli chcemy użyć data.sql do wypełnienia schematu utworzonego przez Hibernate, należy ustawić spring.jpa.defer-datasource-initialization na true. Mieszanie technologii inicjalizacji bazy danych nie jest zalecane, ale jeśli bardzo potrzebujemy takiego rozwiązania, ustawienie spring.jpa.defer-datasource-initialization na true pozwoli także na pracę skryptu schema.sql na schemacie utworzonym przez Hibernate, zanim zostanie on wypełniony przez data.sql.
  • Prefiksy zmiennych środowiskowych

    Od teraz możliwe jest określenie prefiksu dla systemowych zmiennych środowiskowych, dzięki czemu można uruchomić wiele różnych aplikacji Spring Boot w tym samym środowisku. Wystarczy użyć metody setEnvironmentPrefix(…), aby ustawić prefiks, którego chcemy użyć podczas wiązania właściwości. Na przykład poniższy kod doda prefiks myapp:
        SpringApplication application = new SpringApplication(MyApp.class);
        application.setEnvironmentPrefix("myapp");
        SpringApplication.run(args);
    
    Wszystkie właściwości będą teraz oczekiwać wersji z przedrostkiem. Na przykład, aby zmienić port serwera, użyjemy teraz właściwości MYAPP_SERVER_PORT.
  • Adresy URL Flyway i Liquibase JDBC

    Jeśli obecnie definiujesz spring.flyway.url lub spring.liquibase.url, konieczne jest podanie dodatkowych właściwości nazwy użytkownika i hasła. We wcześniejszych wersjach Spring Boot ustawienia te pochodziły z właściwości spring.datasource, ale okazało się to problematyczne dla osób, które dostarczyły własne beany DataSource i dlatego zostało to zmienione.
  • Budowanie projektu z Gradle

    Obecnie minimalną wersją Gradle'a do budowy projektu jest Gradle 6.8. Plugin Spring Boot Gradle wspiera Gradle 7.0.x.
  • Wsparcie dla Jetty 10

    Możliwe jest przejście do Jetty 10. W tym celu należy nadpisać wersję za pomocą właściwości jetty.version. Oprócz tego konieczne jest wykluczenie (exclusion):
    org.eclipse.jetty.websocket:websocket-server
    org.eclipse.jetty.websocket:javax-websocket-server-impl
    
    ze startera spring-boot-starter-jetty, ponieważ są one specyficzne dla Jetty 9.
Ostatnie wersje Spring Boota wprowadzają naprawdę istotne zmiany i w razie potrzeby szybkiego przejścia na wyższą wersję możemy natknąć się na nieprzyjemne i dosyć frustrujące problemy. Nikt pewnie nie lubi sytuacji, w której podczas szybkiego upgrade'u wersji nagle pojawiają się niespodzianki w postaci niekompilującego się kodu lub w ogóle niedziałających fragmentów aplikacji.
Autor: Jarek Klimas
Data: 14 października 2021
Labele:Backend, Poziom podstawowy, Spring, Spring Boot Linki:
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.4-Release-Notes
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.5-Release-Notes
Masz swoje przemyślenia na temat artykułu? Podziel się nimi!
Masz pytanie odnośnie zagadnienia omawianego w artykule?
Coś, co napisaliśmy, nie zaspokoiło Twojego głodu wiedzy?
Daj nam znać co myślisz i skomentuj artykuł na facebooku!

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE