{"id":9987,"date":"2022-04-05T18:18:47","date_gmt":"2022-04-05T16:18:47","guid":{"rendered":"https:\/\/vived.io\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/"},"modified":"2022-09-19T13:10:40","modified_gmt":"2022-09-19T11:10:40","slug":"jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/","title":{"rendered":"JVM Tuesday #82 &#8211; Nowy Kotlin, Nowy Hibernate&#8230; i SpringShell"},"content":{"rendered":"\n<h2 id=\"1-w-koncu-wyszedl-kotlin-1-6-20\" data-num=1>1. W ko\u0144cu wyszed\u0142 Kotlin 1.6.20<\/h2>\n\n\n\n<p>W ostatnich paru tygodniach w \u015bwiecie Kotlina by\u0142o naprawd\u0119 cicho &#8211; ale tak cicho cicho, \u017ce newsletter <a href=\"http:\/\/www.kotlinweekly.net\/\">Kotlin Weekly<\/a> zacz\u0105\u0142 grzeba\u0107 \u0142ych\u0105 pod dnie gara, i to raczej wios\u0142uj\u0105c po mocno przypalone resztki. Sami ju\u017c kilka edycji temu uspokoili\u015bmy, \u017ce inwazja Rosji na Ukrain\u0119 nie powinna by\u0107 egzystencjalnym problemem dla j\u0119zyka mimo jego korzeni, jednak oczekiwania na kolejn\u0105 edycj\u0119 nieco si\u0119 przeci\u0105ga\u0142y. Oto jednak mamy wydanie 1.6.20, kt\u00f3re zgodnie z Kotlinowym cyklem releasowym jest wydaniem przygotowuj\u0105cym nas powoli do wersji 1.7. Co zatem ciekawego przyniesie i czy warto by\u0142o czeka\u0107?<\/p>\n\n\n\n<p>Du\u017c\u0105 zmian\u0105, przyniesion\u0105 przez Kotlina 1.6.20 to tak zwane Context Receivers. Ju\u017c w tej chwili w ramach Kotlina do\u015b\u0107 popularnym konceptem s\u0105 funkcje rozszerzaj\u0105ce (extension functions). Pozwalaj\u0105 one doda\u0107 funkcj\u0119 do hmmm\u2026 powiedzie\u0107 obiekt\u00f3w by\u0142oby sporym przek\u0142amaniem. Je\u015bli we\u017amiemy sobie za przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fun List&lt;Int&gt;.sum(): <\/code><\/pre>\n\n\n\n<p>w tego typu wywo\u0142aniu odbiorc\u0105 (receiverem) b\u0119dzie List&lt;Int&gt; \u2013 czyli kontener (List) razem z parametrem (Int).&nbsp;<\/p>\n\n\n\n<p>Prosto, prawda? To tw\u00f3rcy Kotlina postanowili to nieco utrudni\u0107 (ale nie martwcie si\u0119, wszystko dla Waszego dobra \ud83d\ude09. Ot\u00f3\u017c, od tej pory b\u0119dzie mo\u017cna zdefiniowa\u0107 nie tylko odbiorc\u0119, ale r\u00f3wnie\u017c bardzo precyzyjnie zaw\u0119zi\u0107 kontekst, w kt\u00f3rym mo\u017ce on pracowa\u0107. Popatrzcie na poni\u017cszy przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>context(Comparator&lt;A&gt;)\nfun &lt;A&gt; List&lt;A&gt;.sort(): List&lt;A&gt; = sortedWith(this@Comparator)<\/code><\/pre>\n\n\n\n<p>O ile w powy\u017cszym przypadku .sum() mog\u0142o by\u0107 u\u017cyte w ca\u0142ym zdefiniowanym scope (zwykle konkretnym pliku lub module), o tyle powy\u017csze.sort zadzia\u0142a tylko w kontek\u015bcie konkretnego komparatora. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>with(Comparator.naturalOrder&lt;Int&gt;()) {\n  listOf(3, 5, 1).sort()\n}<\/code><\/pre>\n\n\n\n<p>Opr\u00f3cz tego, aby zapewni\u0107 lepsz\u0105 interoperacyjno\u015b\u0107 podczas rozszerzania og\u00f3lnych klas i interfejs\u00f3w Java, Kotlin 1.6.20 umo\u017cliwia oznaczenie generyk\u00f3w jako nie dopuszczaj\u0105cego warto\u015bci null. Wprowadzono r\u00f3wnie\u017c obs\u0142ug\u0119 struktury hierarchicznej dla projekt\u00f3w wieloplatformowych &#8211; Kotlin Multiplatform otrzyma\u0142 te\u017c \u0142atwiejsz\u0105 mo\u017cliwo\u015b\u0107 dzielenia si\u0119 kodem mi\u0119dzy poszczeg\u00f3lnymi platformami.<\/p>\n\n\n\n<p>Sporo zmian dotkn\u0119\u0142o te\u017c kompilator. Wprowadzono r\u00f3wnoleg\u0142\u0105 kompilacj\u0119 plik\u00f3w (mo\u017cna j\u0105 uruchomi\u0107 eksperymentaln\u0105 flag\u0105 -Xbackend-threads) oraz inkrementaln\u0105 kompilacj\u0119 dla Kotlin\/JS. Wykorzystuje on zbuforowane wyniki kompilacji dla niezmienionych plik\u00f3w \u017ar\u00f3d\u0142owych podczas kolejnych kompilacji, dzi\u0119ki czemu ich uko\u0144czenie przebiega szybciej, zw\u0142aszcza przy niewielkich zmianach.<\/p>\n\n\n\n<p>Troch\u0119 tego jest jak widzicie, aczkolwiek wi\u0119kszo\u015b\u0107 zmian to jednak pod mask\u0105. Ciekawe, co poza stabilnymi Context Receivers zobaczymy w kolejnym \u201cdu\u017cym\u201d wydaniu Kotlina.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b50ab3d5.png\" alt=\"\" width=\"800\" height=\"450\"\/><figcaption>No, to teraz tylko czeka\u0107 na Kotlina 1.7 &#8211; ciekawe czy zgodnie z kalendarzem.<\/figcaption><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2022\/04\/kotlin-1-6-20-released\/\">Kotlin 1.6.20 Released<\/a><\/li><\/ul>\n\n\n\n<h2 id=\"2-czy-springshell-to-nowy-log4shell\" data-num=2>2. Czy SpringShell to nowy Log4Shell?<\/h2>\n\n\n\n<p>Podejrzewam, \u017ce ma\u0142o kto mia\u0142 przyjemno\u015b\u0107 zapomnie\u0107 o Log4Shellu, podatno\u015bci kt\u00f3ra wr\u0119cz przeora\u0142a javowy ekosystem i pozwoli\u0142a zarobi\u0107 wielu pracownikom dzia\u0142\u00f3w IT na wypasione \u015bwi\u0119ta, przynajmniej w firmach, kt\u00f3re wyp\u0142acaj\u0105 nadgodziny &#8211; bo tych by\u0142o w tym okresie masakrycznie du\u017co. Pami\u0119tam te\u017c pociech\u0119, kt\u00f3r\u0105 powtarzali sobie dojechani robot\u0105 programi\u015bci &#8211; \u201cDobrze, \u017ce Spring nie jest podatny\u2026 to by dopiero by\u0142o\u201d. Dlatego gdy sie\u0107 obieg\u0142a informacja o nowej wykrytej podatno\u015bci w ramach tego w\u0142a\u015bnie frameworka, wszystkich obla\u0142 blady strach i informacja zacz\u0119\u0142a obiega\u0107 firmowe (i nie tylko) Slacki w tempie b\u0142yskawicy.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b551ee9f.png\" alt=\"\"\/><\/figure><\/div>\n\n\n<p>Dodatkowo, ca\u0142a podatno\u015b\u0107 wydaje si\u0119 mie\u0107 \u015bwietnych spec\u00f3w od Public Relations, poniewa\u017c z miejsca zosta\u0142a og\u0142oszona jako SpringShell, wi\u0119c pod nazw\u0105 sugeruj\u0105c\u0105 gro\u017ane konotacje (a dodatkowo b\u0119d\u0105c nazw\u0105 tak\u0105 sam\u0105 jak jeden z <a href=\"https:\/\/spring.io\/projects\/spring-shell\">modu\u0142\u00f3w Spring Boot<\/a>, wi\u0119c jej wyszukanie w Google wcale nie jest takie oczywiste).<\/p>\n\n\n\n<p>Czym tak naprawd\u0119 jest Spring Shell? Ot\u00f3\u017c okaza\u0142o si\u0119, \u017ce w JDK9+ (i tak, je\u015bli u\u017cywacie ci\u0105gle \u00f3semki, mo\u017cecie przesta\u0107 czyta\u0107), poprzez mechanizm DataBinding (czyli mapowania parametr\u00f3w URL na istniej\u0105ce klasy), mo\u017cliwe jest wstrzykni\u0119cie wewn\u0119trznych parametr\u00f3w danej klasy.&nbsp;<\/p>\n\n\n\n<p>Poni\u017cszy kod pochodzi z oficjalnej dokumentacji Springa i\u2026. jest podatny na atak:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@PostMapping(&quot;\/greeting&quot;)\npublic String greetingSubmit(@ModelAttribute Greeting greeting, Model model) {\n    model.addAttribute(&quot;greeting&quot;, greeting);\n    return &quot;result&quot;;\n}\n\npublic class Greeting {\n\n  private long id;\n  private String content;\n\n  public long getId() {\n    return id;\n  }\n\n  public void setId(long id) {\n    this.id = id;\n  }\n\n  public String getContent() {\n    return content;\n  }\n\n  public void setContent(String content) {\n    this.content = content;\n  }\n\n}\n<\/code><\/pre>\n\n\n\n<p>Oczywi\u015bcie, s\u0105 takie parametry, kt\u00f3re raczej nie chcieliby\u015bmy mie\u0107 mo\u017cliwo\u015bci nadpisa\u0107, ze wzgl\u0119d\u00f3w bezpiecze\u0144stwa. Spring <a href=\"https:\/\/github.com\/spring-projects\/spring-framework\/blob\/b595dc1dfad9db534ca7b9e8f46bb9926b88ab5a\/spring-beans\/src\/main\/java\/org\/springframework\/beans\/CachedIntrospectionResults.java#L290\">w swoim kodzie<\/a> bezpo\u015brednio broni si\u0119 przed pr\u00f3b\u0105 takiego dzia\u0142ania:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (Class.class == beanClass &amp;&amp; (&quot;classLoader&quot;.equals(pd.getName()) ||  &quot;protectionDomain&quot;.equals(pd.getName()))) {\n\t\/\/ Ignore Class.getClassLoader() and getProtectionDomain() methods - nobody needs to bind to those\ncontinue;\n}<\/code><\/pre>\n\n\n\n<p>Okaza\u0142o si\u0119, \u017ce wraz z JDK 9 pojawi\u0142a si\u0119 nowa metoda Class.getModule(), a tw\u00f3rcy Springa\u2026 zapomnieli j\u0105 r\u00f3wnie\u017c zabezpieczy\u0107 jako kolejny warunek w powy\u017cszym \u201cifie\u201d. Poprzez t\u0105 metod\u0119, atakuj\u0105cy mo\u017ce nadpisa\u0107 pola w ramach Class Loadera. Na ten moment, uda\u0142o si\u0119 przygotowa\u0107 z u\u017cyciem powy\u017cszego mechanizmu skuteczny atak&nbsp; Apache Tomcat ze Springiem deployowanym jako *.war &#8211; mo\u017cliwe jednak, \u017ce w przysz\u0142o\u015bci wektor ataku stanie si\u0119 szerszy. Je\u015bli chcecie wi\u0119cej detali, ca\u0142o\u015b\u0107 zosta\u0142a <a href=\"https:\/\/jfrog.com\/blog\/springshell-zero-day-vulnerability-all-you-need-to-know\/\">\u015bwietnie opisana przez jFrog<\/a>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b589c5e7.png\" alt=\"\" width=\"675\" height=\"210\"\/><figcaption>Dzia\u0142y Security w firmach ju\u017c ciesz\u0105 mordki, bo od dawna wiedzia\u0142y, \u017ce ta Java 9 to za ma\u0142o wygrzana, \u017ceby rozs\u0105dny cz\u0142owiek to na produkcj\u0119 wrzuca\u0142.<\/figcaption><\/figure><\/div>\n\n\n<p>Najlepszym sposobem na naprawienie SpringShell jest aktualizacja Spring Framework do wersji 5.2.20 lub 5.3.18. U\u017cytkownicy Spring Boot powinni za\u015b przeskoczy\u0107 do wersji 2.6.6.<\/p>\n\n\n\n<p>\u017beby podtrzyma\u0107 atmosfer\u0119 grozy, chcia\u0142bym si\u0119 tutaj podzieli\u0107 jakim\u015b mro\u017c\u0105c\u0105 krew ocen\u0105 zwi\u0105zanego z podatno\u015bci\u0105 ryzyka, ale w obecnej chwili <a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2022-22965\">CVE-2022-22965<\/a>, bo tak\u0105 sygnatur\u0119 dosta\u0142a, czeka jeszcze ona na dok\u0142adniejsz\u0105 analiz\u0119. Problem zosta\u0142 ju\u017c za\u0142atany, ale ciekawe, czy sprawa dostanie drugie \u017cycie tak jak by\u0142o to w wypadku Log4Shell.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b5aa0cb6.png\" alt=\"\"\/><figcaption>Kto patchowa\u0142 Log4J w cyrku si\u0119 nie \u015bmieje.<\/figcaption><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/jfrog.com\/blog\/springshell-zero-day-vulnerability-all-you-need-to-know\/\">SpringShell (Spring4Shell) Zero-Day Vulnerability CVE-2022-22965 : All You Need To Know<\/a><\/li><li><a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2022-22965\">NVD &#8211; CVE-2022-22965<\/a><\/li><li><a href=\"https:\/\/github.com\/spring-projects\/spring-framework\/blob\/b595dc1dfad9db534ca7b9e8f46bb9926b88ab5a\/spring-beans\/src\/main\/java\/org\/springframework\/beans\/CachedIntrospectionResults.java#L290\">https:\/\/github.com\/spring-projects\/spring-framework\/blob\/b595dc1dfad9db534ca7b9e8f46bb9926b88ab5a\/spring-beans\/src\/main\/java\/org\/springframework\/beans\/CachedIntrospectionResults.java#L290<\/a><\/li><\/ul>\n\n\n\n<h2 id=\"3-hibernate-6-0-pierwsze-duze-wydanie-od-dekady\" data-num=3>3. Hibernate 6.0 &#8211; pierwsze du\u017ce wydanie od dekady<\/h2>\n\n\n\n<p>Oj, wysypa\u0142o nam ostatnio nowych \u201cdu\u017cych\u201d wyda\u0144 od projekt\u00f3w, kt\u00f3re nie by\u0142y aktualizowane od dobrych par\u0119 lat. W zesz\u0142y poniedzia\u0142ek informowali\u015bmy o nowym Clojure, w czwartek o React 18, a dzisiaj mamy Hibernate 6.0 &#8211; edycj\u0119, kt\u00f3ra jest pierwszym \u201cmajorem\u201d Hibernate od roku 2011 \ud83d\ude09. Nie oznacza to oczywi\u015bcie, \u017ce rozw\u00f3j biblioteki sta\u0142 w miejscu &#8211; ka\u017cda z regularnie wydawanych minor\u00f3w 5.x przynosi\u0142a nowo\u015bci. Ostatnimi czasy jednak nie tylko wi\u0119cej m\u00f3wi\u0142o si\u0119 o pobocznych projektach, takich jak Hibernate Reactive, ale i sama biblioteka nie przynosi\u0142 pozytywnych (a w najlepszym wypadku &#8211; neutralne) skojarzenia. Czy \u201csz\u00f3stka\u201d ma szans\u0119 pom\u00f3c odzyska\u0107 Hibernate zal\u015bni\u0107 na nowo?<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b5b0429a.gif\" alt=\"\"\/><figcaption>All work (on Hibernate) and no play makes Jack a dull boy<\/figcaption><\/figure><\/div>\n\n\n<p>Nowy Hibernate to przede wszystkim nowe adnotacje, kt\u00f3re porzuci\u0142y swoje XMLowe korzenie i doczeka\u0142y si\u0119 sporej ilo\u015bci zmian min. lepsze type-safety. Du\u017cym krokiem do przodu jest te\u017c Semantic Query Model (SQM) &#8211; nowy parser zapyta\u0144 o encje, kt\u00f3ry obs\u0142uguje zar\u00f3wno JPQL, jak i Criteria API. Nowy parser b\u0119dzie znacznie bardziej elastyczny, dzi\u0119ki czemu zapewniamy lepsz\u0105 translacj\u0119 zapyta\u0144 o encje w j\u0119zyku SQL. Dodatkowo, pojawi\u0142a si\u0119 poprawa wydajno\u015bci poprzez zmian\u0119 z odczytu kolumn po nazwie na odczyt wed\u0142ug pozycji w ramach ResultSetu oraz aktualizacja u\u017cywanego przez Hibernate parsera z ANTLR 2 na 4.<\/p>\n\n\n\n<p>Bardzo du\u017c\u0105 zmian\u0105 jest te\u017c migracja Hibernate na Jakart\u0119 EE i porzucenie starych API zwi\u0105zanych z Java EE. To w\u0142a\u015bnie min. z tym wi\u0105\u017ce si\u0119 podbicie du\u017cej wersji aplikacji &#8211; z wiadomych wzgl\u0119d\u00f3w, pojawia si\u0119 potrzeba migracji z przestrzeni nazw javax.persistence do jakarta.persistence. Na szcz\u0119\u015bcie powsta\u0142 do tego specjalny <a href=\"https:\/\/github.com\/eclipse\/transformer\">automatyczny Transformer<\/a>.<\/p>\n\n\n\n<p>A skoro ju\u017c o tym m\u00f3wimy, nie mo\u017cna nie wspomnie\u0107 o nowej wersji Jakarty Persistence. Standard b\u0119d\u0105cy kontynuacj\u0105 znanego pewnie wi\u0119kszo\u015bci JPA (Java Persistence API) ukaza\u0142 <a href=\"https:\/\/newsroom.eclipse.org\/eclipse-newsletter\/2022\/march\/what%E2%80%99s-new-jakarta-persistence-31\">si\u0119 w wersji 3.1<\/a>, kt\u00f3ra to stanie si\u0119 cz\u0119\u015bci\u0105 nadchodz\u0105cej Jakarty EE 10. Ta przynosi porz\u0105dne wsparcie dla UUID (java.util.UUID wreszcie jest traktowane jako typ podstawowy), rozwini\u0119cie Query Language and Criteria API. Pojawi\u0142y si\u0119 te\u017c nowe funkcje numeryczne (jak FLOOR czy ROUND), lepsze wsparcie dla LocalDate oraz wyci\u0105ganie konkretnych fragment\u00f3w daty za pomoc EXTRACT z SQL.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0179r\u00f3d\u0142a<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/github.com\/eclipse\/transformer\">https:\/\/github.com\/eclipse\/transformer<\/a><\/li><li><a href=\"https:\/\/newsroom.eclipse.org\/eclipse-newsletter\/2022\/march\/what%E2%80%99s-new-jakarta-persistence-31\">https:\/\/newsroom.eclipse.org\/eclipse-newsletter\/2022\/march\/what%E2%80%99s-new-jakarta-persistence-31<\/a><\/li><li><a href=\"https:\/\/in.relation.to\/2022\/03\/31\/orm-60-final\/\">https:\/\/in.relation.to\/2022\/03\/31\/orm-60-final\/<\/a><\/li><\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dzisiaj mamy du\u017co kodu&#8230; jak na ten przegl\u0105d wr\u0119cz zadziwiaj\u0105co du\u017co. Ale te\u017c akurat jest go ca\u0142kiem sporo ciekawego do pokazania, zw\u0142aszcza w kontek\u015bcie ostatniej premiery Kotlina i du\u017cej podatno\u015bci Springa. Ale i tak gwiazd\u0105 ca\u0142o\u015bci jest nowy Hibernate \ud83e\udd76. <\/p>\n","protected":false},"author":10,"featured_media":8017,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[259],"tags":[],"class_list":["post-9987","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm-pl"],"acf":{"estimated_reading_time":"7","feature_image_blog":{"ID":8018,"id":8018,"title":"Futurama-Pilot-640x440-1","filename":"Futurama-Pilot-640x440-1.jpeg","filesize":89058,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/Futurama-Pilot-640x440-1.jpeg","link":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/futurama-pilot-640x440-1-2\/","alt":"","author":"10","description":"","caption":"","name":"futurama-pilot-640x440-1-2","status":"inherit","uploaded_to":9987,"date":"2022-04-05 16:17:11","modified":"2022-04-05 16:17:11","menu_order":0,"mime_type":"image\/jpeg","type":"image","subtype":"jpeg","icon":"https:\/\/vived.io\/wp-includes\/images\/media\/default.png","width":640,"height":440,"sizes":{"thumbnail":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/Futurama-Pilot-640x440-1-150x150.jpeg","thumbnail-width":150,"thumbnail-height":150,"medium":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/Futurama-Pilot-640x440-1-300x206.jpeg","medium-width":300,"medium-height":206,"medium_large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/Futurama-Pilot-640x440-1.jpeg","medium_large-width":640,"medium_large-height":440,"large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/Futurama-Pilot-640x440-1.jpeg","large-width":640,"large-height":440,"1536x1536":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/Futurama-Pilot-640x440-1.jpeg","1536x1536-width":640,"1536x1536-height":440,"2048x2048":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/Futurama-Pilot-640x440-1.jpeg","2048x2048-width":640,"2048x2048-height":440,"gform-image-choice-sm":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/Futurama-Pilot-640x440-1.jpeg","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":206,"gform-image-choice-md":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/Futurama-Pilot-640x440-1.jpeg","gform-image-choice-md-width":400,"gform-image-choice-md-height":275,"gform-image-choice-lg":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/Futurama-Pilot-640x440-1.jpeg","gform-image-choice-lg-width":600,"gform-image-choice-lg-height":413}},"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/JVM.png","feature_image_visible":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>JVM Tuesday #82 - Nowy Kotlin, Nowy Hibernate... i SpringShell - Vived<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JVM Tuesday #82 - Nowy Kotlin, Nowy Hibernate... i SpringShell - Vived\" \/>\n<meta property=\"og:description\" content=\"Dzisiaj mamy du\u017co kodu... jak na ten przegl\u0105d wr\u0119cz zadziwiaj\u0105co du\u017co. Ale te\u017c akurat jest go ca\u0142kiem sporo ciekawego do pokazania, zw\u0142aszcza w kontek\u015bcie ostatniej premiery Kotlina i du\u017cej podatno\u015bci Springa. Ale i tak gwiazd\u0105 ca\u0142o\u015bci jest nowy Hibernate \ud83e\udd76.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2022-04-05T16:18:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-19T11:10:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/JVM.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Artur Skowro\u0144ski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"JVM Tuesday #82 &#8211; Nowy Kotlin, Nowy Hibernate&#8230; i SpringShell\",\"datePublished\":\"2022-04-05T16:18:47+00:00\",\"dateModified\":\"2022-09-19T11:10:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/\"},\"wordCount\":1380,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/JVM.png\",\"articleSection\":[\"JVM\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/\",\"url\":\"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/\",\"name\":\"JVM Tuesday #82 - Nowy Kotlin, Nowy Hibernate... i SpringShell - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/JVM.png\",\"datePublished\":\"2022-04-05T16:18:47+00:00\",\"dateModified\":\"2022-09-19T11:10:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/JVM.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/JVM.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JVM Tuesday #82 &#8211; Nowy Kotlin, Nowy Hibernate&#8230; i SpringShell\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/vived.io\/pl\/#website\",\"url\":\"https:\/\/vived.io\/pl\/\",\"name\":\"Vived\",\"description\":\"platform empowering IT people and technology companies to synergic growth\",\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/vived.io\/pl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/vived.io\/pl\/#organization\",\"name\":\"Vived\",\"url\":\"https:\/\/vived.io\/pl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"width\":136,\"height\":45,\"caption\":\"Vived\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\",\"name\":\"Artur Skowro\u0144ski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"caption\":\"Artur Skowro\u0144ski\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"JVM Tuesday #82 - Nowy Kotlin, Nowy Hibernate... i SpringShell - Vived","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/","og_locale":"pl_PL","og_type":"article","og_title":"JVM Tuesday #82 - Nowy Kotlin, Nowy Hibernate... i SpringShell - Vived","og_description":"Dzisiaj mamy du\u017co kodu... jak na ten przegl\u0105d wr\u0119cz zadziwiaj\u0105co du\u017co. Ale te\u017c akurat jest go ca\u0142kiem sporo ciekawego do pokazania, zw\u0142aszcza w kontek\u015bcie ostatniej premiery Kotlina i du\u017cej podatno\u015bci Springa. Ale i tak gwiazd\u0105 ca\u0142o\u015bci jest nowy Hibernate \ud83e\udd76.","og_url":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/","og_site_name":"Vived","article_published_time":"2022-04-05T16:18:47+00:00","article_modified_time":"2022-09-19T11:10:40+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/JVM.png","type":"image\/png"}],"author":"Artur Skowro\u0144ski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"JVM Tuesday #82 &#8211; Nowy Kotlin, Nowy Hibernate&#8230; i SpringShell","datePublished":"2022-04-05T16:18:47+00:00","dateModified":"2022-09-19T11:10:40+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/"},"wordCount":1380,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/JVM.png","articleSection":["JVM"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/","url":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/","name":"JVM Tuesday #82 - Nowy Kotlin, Nowy Hibernate... i SpringShell - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/JVM.png","datePublished":"2022-04-05T16:18:47+00:00","dateModified":"2022-09-19T11:10:40+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/JVM.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/04\/JVM.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/jvm-tuesday-82-nowy-kotlin-nowy-hibernate-i-springshell\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"JVM Tuesday #82 &#8211; Nowy Kotlin, Nowy Hibernate&#8230; i SpringShell"}]},{"@type":"WebSite","@id":"https:\/\/vived.io\/pl\/#website","url":"https:\/\/vived.io\/pl\/","name":"Vived","description":"platform empowering IT people and technology companies to synergic growth","publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vived.io\/pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/vived.io\/pl\/#organization","name":"Vived","url":"https:\/\/vived.io\/pl\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/","url":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","width":136,"height":45,"caption":"Vived"},"image":{"@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3","name":"Artur Skowro\u0144ski","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","caption":"Artur Skowro\u0144ski"}}]}},"blocks_vived":[{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>1. W ko\u0144cu wyszed\u0142 Kotlin 1.6.20<\/h2>\n","innerContent":["\n<h2>1. W ko\u0144cu wyszed\u0142 Kotlin 1.6.20<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W ostatnich paru tygodniach w \u015bwiecie Kotlina by\u0142o naprawd\u0119 cicho - ale tak cicho cicho, \u017ce newsletter <a href=\"http:\/\/www.kotlinweekly.net\/\">Kotlin Weekly<\/a> zacz\u0105\u0142 grzeba\u0107 \u0142ych\u0105 pod dnie gara, i to raczej wios\u0142uj\u0105c po mocno przypalone resztki. Sami ju\u017c kilka edycji temu uspokoili\u015bmy, \u017ce inwazja Rosji na Ukrain\u0119 nie powinna by\u0107 egzystencjalnym problemem dla j\u0119zyka mimo jego korzeni, jednak oczekiwania na kolejn\u0105 edycj\u0119 nieco si\u0119 przeci\u0105ga\u0142y. Oto jednak mamy wydanie 1.6.20, kt\u00f3re zgodnie z Kotlinowym cyklem releasowym jest wydaniem przygotowuj\u0105cym nas powoli do wersji 1.7. Co zatem ciekawego przyniesie i czy warto by\u0142o czeka\u0107?<\/p>\n","innerContent":["\n<p>W ostatnich paru tygodniach w \u015bwiecie Kotlina by\u0142o naprawd\u0119 cicho - ale tak cicho cicho, \u017ce newsletter <a href=\"http:\/\/www.kotlinweekly.net\/\">Kotlin Weekly<\/a> zacz\u0105\u0142 grzeba\u0107 \u0142ych\u0105 pod dnie gara, i to raczej wios\u0142uj\u0105c po mocno przypalone resztki. Sami ju\u017c kilka edycji temu uspokoili\u015bmy, \u017ce inwazja Rosji na Ukrain\u0119 nie powinna by\u0107 egzystencjalnym problemem dla j\u0119zyka mimo jego korzeni, jednak oczekiwania na kolejn\u0105 edycj\u0119 nieco si\u0119 przeci\u0105ga\u0142y. Oto jednak mamy wydanie 1.6.20, kt\u00f3re zgodnie z Kotlinowym cyklem releasowym jest wydaniem przygotowuj\u0105cym nas powoli do wersji 1.7. Co zatem ciekawego przyniesie i czy warto by\u0142o czeka\u0107?<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Du\u017c\u0105 zmian\u0105, przyniesion\u0105 przez Kotlina 1.6.20 to tak zwane Context Receivers. Ju\u017c w tej chwili w ramach Kotlina do\u015b\u0107 popularnym konceptem s\u0105 funkcje rozszerzaj\u0105ce (extension functions). Pozwalaj\u0105 one doda\u0107 funkcj\u0119 do hmmm\u2026 powiedzie\u0107 obiekt\u00f3w by\u0142oby sporym przek\u0142amaniem. Je\u015bli we\u017amiemy sobie za przyk\u0142ad:<\/p>\n","innerContent":["\n<p>Du\u017c\u0105 zmian\u0105, przyniesion\u0105 przez Kotlina 1.6.20 to tak zwane Context Receivers. Ju\u017c w tej chwili w ramach Kotlina do\u015b\u0107 popularnym konceptem s\u0105 funkcje rozszerzaj\u0105ce (extension functions). Pozwalaj\u0105 one doda\u0107 funkcj\u0119 do hmmm\u2026 powiedzie\u0107 obiekt\u00f3w by\u0142oby sporym przek\u0142amaniem. Je\u015bli we\u017amiemy sobie za przyk\u0142ad:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>fun List&lt;Int&gt;.sum(): <\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>fun List&lt;Int&gt;.sum(): <\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>w tego typu wywo\u0142aniu odbiorc\u0105 (receiverem) b\u0119dzie List&lt;Int&gt; \u2013 czyli kontener (List) razem z parametrem (Int).&nbsp;<\/p>\n","innerContent":["\n<p>w tego typu wywo\u0142aniu odbiorc\u0105 (receiverem) b\u0119dzie List&lt;Int&gt; \u2013 czyli kontener (List) razem z parametrem (Int).&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Prosto, prawda? To tw\u00f3rcy Kotlina postanowili to nieco utrudni\u0107 (ale nie martwcie si\u0119, wszystko dla Waszego dobra \ud83d\ude09. Ot\u00f3\u017c, od tej pory b\u0119dzie mo\u017cna zdefiniowa\u0107 nie tylko odbiorc\u0119, ale r\u00f3wnie\u017c bardzo precyzyjnie zaw\u0119zi\u0107 kontekst, w kt\u00f3rym mo\u017ce on pracowa\u0107. Popatrzcie na poni\u017cszy przyk\u0142ad:<\/p>\n","innerContent":["\n<p>Prosto, prawda? To tw\u00f3rcy Kotlina postanowili to nieco utrudni\u0107 (ale nie martwcie si\u0119, wszystko dla Waszego dobra \ud83d\ude09. Ot\u00f3\u017c, od tej pory b\u0119dzie mo\u017cna zdefiniowa\u0107 nie tylko odbiorc\u0119, ale r\u00f3wnie\u017c bardzo precyzyjnie zaw\u0119zi\u0107 kontekst, w kt\u00f3rym mo\u017ce on pracowa\u0107. Popatrzcie na poni\u017cszy przyk\u0142ad:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>context(Comparator&lt;A&gt;)\nfun &lt;A&gt; List&lt;A&gt;.sort(): List&lt;A&gt; = sortedWith(this@Comparator)<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>context(Comparator&lt;A&gt;)\nfun &lt;A&gt; List&lt;A&gt;.sort(): List&lt;A&gt; = sortedWith(this@Comparator)<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>O ile w powy\u017cszym przypadku .sum() mog\u0142o by\u0107 u\u017cyte w ca\u0142ym zdefiniowanym scope (zwykle konkretnym pliku lub module), o tyle powy\u017csze.sort zadzia\u0142a tylko w kontek\u015bcie konkretnego komparatora. <\/p>\n","innerContent":["\n<p>O ile w powy\u017cszym przypadku .sum() mog\u0142o by\u0107 u\u017cyte w ca\u0142ym zdefiniowanym scope (zwykle konkretnym pliku lub module), o tyle powy\u017csze.sort zadzia\u0142a tylko w kontek\u015bcie konkretnego komparatora. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>with(Comparator.naturalOrder&lt;Int&gt;()) {\n  listOf(3, 5, 1).sort()\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>with(Comparator.naturalOrder&lt;Int&gt;()) {\n  listOf(3, 5, 1).sort()\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Opr\u00f3cz tego, aby zapewni\u0107 lepsz\u0105 interoperacyjno\u015b\u0107 podczas rozszerzania og\u00f3lnych klas i interfejs\u00f3w Java, Kotlin 1.6.20 umo\u017cliwia oznaczenie generyk\u00f3w jako nie dopuszczaj\u0105cego warto\u015bci null. Wprowadzono r\u00f3wnie\u017c obs\u0142ug\u0119 struktury hierarchicznej dla projekt\u00f3w wieloplatformowych - Kotlin Multiplatform otrzyma\u0142 te\u017c \u0142atwiejsz\u0105 mo\u017cliwo\u015b\u0107 dzielenia si\u0119 kodem mi\u0119dzy poszczeg\u00f3lnymi platformami.<\/p>\n","innerContent":["\n<p>Opr\u00f3cz tego, aby zapewni\u0107 lepsz\u0105 interoperacyjno\u015b\u0107 podczas rozszerzania og\u00f3lnych klas i interfejs\u00f3w Java, Kotlin 1.6.20 umo\u017cliwia oznaczenie generyk\u00f3w jako nie dopuszczaj\u0105cego warto\u015bci null. Wprowadzono r\u00f3wnie\u017c obs\u0142ug\u0119 struktury hierarchicznej dla projekt\u00f3w wieloplatformowych - Kotlin Multiplatform otrzyma\u0142 te\u017c \u0142atwiejsz\u0105 mo\u017cliwo\u015b\u0107 dzielenia si\u0119 kodem mi\u0119dzy poszczeg\u00f3lnymi platformami.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Sporo zmian dotkn\u0119\u0142o te\u017c kompilator. Wprowadzono r\u00f3wnoleg\u0142\u0105 kompilacj\u0119 plik\u00f3w (mo\u017cna j\u0105 uruchomi\u0107 eksperymentaln\u0105 flag\u0105 -Xbackend-threads) oraz inkrementaln\u0105 kompilacj\u0119 dla Kotlin\/JS. Wykorzystuje on zbuforowane wyniki kompilacji dla niezmienionych plik\u00f3w \u017ar\u00f3d\u0142owych podczas kolejnych kompilacji, dzi\u0119ki czemu ich uko\u0144czenie przebiega szybciej, zw\u0142aszcza przy niewielkich zmianach.<\/p>\n","innerContent":["\n<p>Sporo zmian dotkn\u0119\u0142o te\u017c kompilator. Wprowadzono r\u00f3wnoleg\u0142\u0105 kompilacj\u0119 plik\u00f3w (mo\u017cna j\u0105 uruchomi\u0107 eksperymentaln\u0105 flag\u0105 -Xbackend-threads) oraz inkrementaln\u0105 kompilacj\u0119 dla Kotlin\/JS. Wykorzystuje on zbuforowane wyniki kompilacji dla niezmienionych plik\u00f3w \u017ar\u00f3d\u0142owych podczas kolejnych kompilacji, dzi\u0119ki czemu ich uko\u0144czenie przebiega szybciej, zw\u0142aszcza przy niewielkich zmianach.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Troch\u0119 tego jest jak widzicie, aczkolwiek wi\u0119kszo\u015b\u0107 zmian to jednak pod mask\u0105. Ciekawe, co poza stabilnymi Context Receivers zobaczymy w kolejnym \u201cdu\u017cym\u201d wydaniu Kotlina.<\/p>\n","innerContent":["\n<p>Troch\u0119 tego jest jak widzicie, aczkolwiek wi\u0119kszo\u015b\u0107 zmian to jednak pod mask\u0105. Ciekawe, co poza stabilnymi Context Receivers zobaczymy w kolejnym \u201cdu\u017cym\u201d wydaniu Kotlina.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":800,"height":450},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b50ab3d5.png\" alt=\"\" width=\"800\" height=\"450\"\/><figcaption>No, to teraz tylko czeka\u0107 na Kotlina 1.7 - ciekawe czy zgodnie z kalendarzem.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b50ab3d5.png\" alt=\"\" width=\"800\" height=\"450\"\/><figcaption>No, to teraz tylko czeka\u0107 na Kotlina 1.7 - ciekawe czy zgodnie z kalendarzem.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2022\/04\/kotlin-1-6-20-released\/\">Kotlin 1.6.20 Released<\/a><\/li><\/ul>\n","innerContent":["\n<ul><li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2022\/04\/kotlin-1-6-20-released\/\">Kotlin 1.6.20 Released<\/a><\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>2. Czy SpringShell to nowy Log4Shell?<\/h2>\n","innerContent":["\n<h2>2. Czy SpringShell to nowy Log4Shell?<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Podejrzewam, \u017ce ma\u0142o kto mia\u0142 przyjemno\u015b\u0107 zapomnie\u0107 o Log4Shellu, podatno\u015bci kt\u00f3ra wr\u0119cz przeora\u0142a javowy ekosystem i pozwoli\u0142a zarobi\u0107 wielu pracownikom dzia\u0142\u00f3w IT na wypasione \u015bwi\u0119ta, przynajmniej w firmach, kt\u00f3re wyp\u0142acaj\u0105 nadgodziny - bo tych by\u0142o w tym okresie masakrycznie du\u017co. Pami\u0119tam te\u017c pociech\u0119, kt\u00f3r\u0105 powtarzali sobie dojechani robot\u0105 programi\u015bci - \u201cDobrze, \u017ce Spring nie jest podatny\u2026 to by dopiero by\u0142o\u201d. Dlatego gdy sie\u0107 obieg\u0142a informacja o nowej wykrytej podatno\u015bci w ramach tego w\u0142a\u015bnie frameworka, wszystkich obla\u0142 blady strach i informacja zacz\u0119\u0142a obiega\u0107 firmowe (i nie tylko) Slacki w tempie b\u0142yskawicy.<\/p>\n","innerContent":["\n<p>Podejrzewam, \u017ce ma\u0142o kto mia\u0142 przyjemno\u015b\u0107 zapomnie\u0107 o Log4Shellu, podatno\u015bci kt\u00f3ra wr\u0119cz przeora\u0142a javowy ekosystem i pozwoli\u0142a zarobi\u0107 wielu pracownikom dzia\u0142\u00f3w IT na wypasione \u015bwi\u0119ta, przynajmniej w firmach, kt\u00f3re wyp\u0142acaj\u0105 nadgodziny - bo tych by\u0142o w tym okresie masakrycznie du\u017co. Pami\u0119tam te\u017c pociech\u0119, kt\u00f3r\u0105 powtarzali sobie dojechani robot\u0105 programi\u015bci - \u201cDobrze, \u017ce Spring nie jest podatny\u2026 to by dopiero by\u0142o\u201d. Dlatego gdy sie\u0107 obieg\u0142a informacja o nowej wykrytej podatno\u015bci w ramach tego w\u0142a\u015bnie frameworka, wszystkich obla\u0142 blady strach i informacja zacz\u0119\u0142a obiega\u0107 firmowe (i nie tylko) Slacki w tempie b\u0142yskawicy.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b551ee9f.png\" alt=\"\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b551ee9f.png\" alt=\"\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dodatkowo, ca\u0142a podatno\u015b\u0107 wydaje si\u0119 mie\u0107 \u015bwietnych spec\u00f3w od Public Relations, poniewa\u017c z miejsca zosta\u0142a og\u0142oszona jako SpringShell, wi\u0119c pod nazw\u0105 sugeruj\u0105c\u0105 gro\u017ane konotacje (a dodatkowo b\u0119d\u0105c nazw\u0105 tak\u0105 sam\u0105 jak jeden z <a href=\"https:\/\/spring.io\/projects\/spring-shell\">modu\u0142\u00f3w Spring Boot<\/a>, wi\u0119c jej wyszukanie w Google wcale nie jest takie oczywiste).<\/p>\n","innerContent":["\n<p>Dodatkowo, ca\u0142a podatno\u015b\u0107 wydaje si\u0119 mie\u0107 \u015bwietnych spec\u00f3w od Public Relations, poniewa\u017c z miejsca zosta\u0142a og\u0142oszona jako SpringShell, wi\u0119c pod nazw\u0105 sugeruj\u0105c\u0105 gro\u017ane konotacje (a dodatkowo b\u0119d\u0105c nazw\u0105 tak\u0105 sam\u0105 jak jeden z <a href=\"https:\/\/spring.io\/projects\/spring-shell\">modu\u0142\u00f3w Spring Boot<\/a>, wi\u0119c jej wyszukanie w Google wcale nie jest takie oczywiste).<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Czym tak naprawd\u0119 jest Spring Shell? Ot\u00f3\u017c okaza\u0142o si\u0119, \u017ce w JDK9+ (i tak, je\u015bli u\u017cywacie ci\u0105gle \u00f3semki, mo\u017cecie przesta\u0107 czyta\u0107), poprzez mechanizm DataBinding (czyli mapowania parametr\u00f3w URL na istniej\u0105ce klasy), mo\u017cliwe jest wstrzykni\u0119cie wewn\u0119trznych parametr\u00f3w danej klasy.&nbsp;<\/p>\n","innerContent":["\n<p>Czym tak naprawd\u0119 jest Spring Shell? Ot\u00f3\u017c okaza\u0142o si\u0119, \u017ce w JDK9+ (i tak, je\u015bli u\u017cywacie ci\u0105gle \u00f3semki, mo\u017cecie przesta\u0107 czyta\u0107), poprzez mechanizm DataBinding (czyli mapowania parametr\u00f3w URL na istniej\u0105ce klasy), mo\u017cliwe jest wstrzykni\u0119cie wewn\u0119trznych parametr\u00f3w danej klasy.&nbsp;<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Poni\u017cszy kod pochodzi z oficjalnej dokumentacji Springa i\u2026. jest podatny na atak:<\/p>\n","innerContent":["\n<p>Poni\u017cszy kod pochodzi z oficjalnej dokumentacji Springa i\u2026. jest podatny na atak:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>@PostMapping(\"\/greeting\")\npublic String greetingSubmit(@ModelAttribute Greeting greeting, Model model) {\n    model.addAttribute(\"greeting\", greeting);\n    return \"result\";\n}\n\npublic class Greeting {\n\n  private long id;\n  private String content;\n\n  public long getId() {\n    return id;\n  }\n\n  public void setId(long id) {\n    this.id = id;\n  }\n\n  public String getContent() {\n    return content;\n  }\n\n  public void setContent(String content) {\n    this.content = content;\n  }\n\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>@PostMapping(\"\/greeting\")\npublic String greetingSubmit(@ModelAttribute Greeting greeting, Model model) {\n    model.addAttribute(\"greeting\", greeting);\n    return \"result\";\n}\n\npublic class Greeting {\n\n  private long id;\n  private String content;\n\n  public long getId() {\n    return id;\n  }\n\n  public void setId(long id) {\n    this.id = id;\n  }\n\n  public String getContent() {\n    return content;\n  }\n\n  public void setContent(String content) {\n    this.content = content;\n  }\n\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oczywi\u015bcie, s\u0105 takie parametry, kt\u00f3re raczej nie chcieliby\u015bmy mie\u0107 mo\u017cliwo\u015bci nadpisa\u0107, ze wzgl\u0119d\u00f3w bezpiecze\u0144stwa. Spring <a href=\"https:\/\/github.com\/spring-projects\/spring-framework\/blob\/b595dc1dfad9db534ca7b9e8f46bb9926b88ab5a\/spring-beans\/src\/main\/java\/org\/springframework\/beans\/CachedIntrospectionResults.java#L290\">w swoim kodzie<\/a> bezpo\u015brednio broni si\u0119 przed pr\u00f3b\u0105 takiego dzia\u0142ania:<\/p>\n","innerContent":["\n<p>Oczywi\u015bcie, s\u0105 takie parametry, kt\u00f3re raczej nie chcieliby\u015bmy mie\u0107 mo\u017cliwo\u015bci nadpisa\u0107, ze wzgl\u0119d\u00f3w bezpiecze\u0144stwa. Spring <a href=\"https:\/\/github.com\/spring-projects\/spring-framework\/blob\/b595dc1dfad9db534ca7b9e8f46bb9926b88ab5a\/spring-beans\/src\/main\/java\/org\/springframework\/beans\/CachedIntrospectionResults.java#L290\">w swoim kodzie<\/a> bezpo\u015brednio broni si\u0119 przed pr\u00f3b\u0105 takiego dzia\u0142ania:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>if (Class.class == beanClass &amp;&amp; (\"classLoader\".equals(pd.getName()) ||  \"protectionDomain\".equals(pd.getName()))) {\n\t\/\/ Ignore Class.getClassLoader() and getProtectionDomain() methods - nobody needs to bind to those\ncontinue;\n}<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>if (Class.class == beanClass &amp;&amp; (\"classLoader\".equals(pd.getName()) ||  \"protectionDomain\".equals(pd.getName()))) {\n\t\/\/ Ignore Class.getClassLoader() and getProtectionDomain() methods - nobody needs to bind to those\ncontinue;\n}<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Okaza\u0142o si\u0119, \u017ce wraz z JDK 9 pojawi\u0142a si\u0119 nowa metoda Class.getModule(), a tw\u00f3rcy Springa\u2026 zapomnieli j\u0105 r\u00f3wnie\u017c zabezpieczy\u0107 jako kolejny warunek w powy\u017cszym \u201cifie\u201d. Poprzez t\u0105 metod\u0119, atakuj\u0105cy mo\u017ce nadpisa\u0107 pola w ramach Class Loadera. Na ten moment, uda\u0142o si\u0119 przygotowa\u0107 z u\u017cyciem powy\u017cszego mechanizmu skuteczny atak&nbsp; Apache Tomcat ze Springiem deployowanym jako *.war - mo\u017cliwe jednak, \u017ce w przysz\u0142o\u015bci wektor ataku stanie si\u0119 szerszy. Je\u015bli chcecie wi\u0119cej detali, ca\u0142o\u015b\u0107 zosta\u0142a <a href=\"https:\/\/jfrog.com\/blog\/springshell-zero-day-vulnerability-all-you-need-to-know\/\">\u015bwietnie opisana przez jFrog<\/a>.<\/p>\n","innerContent":["\n<p>Okaza\u0142o si\u0119, \u017ce wraz z JDK 9 pojawi\u0142a si\u0119 nowa metoda Class.getModule(), a tw\u00f3rcy Springa\u2026 zapomnieli j\u0105 r\u00f3wnie\u017c zabezpieczy\u0107 jako kolejny warunek w powy\u017cszym \u201cifie\u201d. Poprzez t\u0105 metod\u0119, atakuj\u0105cy mo\u017ce nadpisa\u0107 pola w ramach Class Loadera. Na ten moment, uda\u0142o si\u0119 przygotowa\u0107 z u\u017cyciem powy\u017cszego mechanizmu skuteczny atak&nbsp; Apache Tomcat ze Springiem deployowanym jako *.war - mo\u017cliwe jednak, \u017ce w przysz\u0142o\u015bci wektor ataku stanie si\u0119 szerszy. Je\u015bli chcecie wi\u0119cej detali, ca\u0142o\u015b\u0107 zosta\u0142a <a href=\"https:\/\/jfrog.com\/blog\/springshell-zero-day-vulnerability-all-you-need-to-know\/\">\u015bwietnie opisana przez jFrog<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":675,"height":210},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b589c5e7.png\" alt=\"\" width=\"675\" height=\"210\"\/><figcaption>Dzia\u0142y Security w firmach ju\u017c ciesz\u0105 mordki, bo od dawna wiedzia\u0142y, \u017ce ta Java 9 to za ma\u0142o wygrzana, \u017ceby rozs\u0105dny cz\u0142owiek to na produkcj\u0119 wrzuca\u0142.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b589c5e7.png\" alt=\"\" width=\"675\" height=\"210\"\/><figcaption>Dzia\u0142y Security w firmach ju\u017c ciesz\u0105 mordki, bo od dawna wiedzia\u0142y, \u017ce ta Java 9 to za ma\u0142o wygrzana, \u017ceby rozs\u0105dny cz\u0142owiek to na produkcj\u0119 wrzuca\u0142.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Najlepszym sposobem na naprawienie SpringShell jest aktualizacja Spring Framework do wersji 5.2.20 lub 5.3.18. U\u017cytkownicy Spring Boot powinni za\u015b przeskoczy\u0107 do wersji 2.6.6.<\/p>\n","innerContent":["\n<p>Najlepszym sposobem na naprawienie SpringShell jest aktualizacja Spring Framework do wersji 5.2.20 lub 5.3.18. U\u017cytkownicy Spring Boot powinni za\u015b przeskoczy\u0107 do wersji 2.6.6.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>\u017beby podtrzyma\u0107 atmosfer\u0119 grozy, chcia\u0142bym si\u0119 tutaj podzieli\u0107 jakim\u015b mro\u017c\u0105c\u0105 krew ocen\u0105 zwi\u0105zanego z podatno\u015bci\u0105 ryzyka, ale w obecnej chwili <a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2022-22965\">CVE-2022-22965<\/a>, bo tak\u0105 sygnatur\u0119 dosta\u0142a, czeka jeszcze ona na dok\u0142adniejsz\u0105 analiz\u0119. Problem zosta\u0142 ju\u017c za\u0142atany, ale ciekawe, czy sprawa dostanie drugie \u017cycie tak jak by\u0142o to w wypadku Log4Shell.<\/p>\n","innerContent":["\n<p>\u017beby podtrzyma\u0107 atmosfer\u0119 grozy, chcia\u0142bym si\u0119 tutaj podzieli\u0107 jakim\u015b mro\u017c\u0105c\u0105 krew ocen\u0105 zwi\u0105zanego z podatno\u015bci\u0105 ryzyka, ale w obecnej chwili <a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2022-22965\">CVE-2022-22965<\/a>, bo tak\u0105 sygnatur\u0119 dosta\u0142a, czeka jeszcze ona na dok\u0142adniejsz\u0105 analiz\u0119. Problem zosta\u0142 ju\u017c za\u0142atany, ale ciekawe, czy sprawa dostanie drugie \u017cycie tak jak by\u0142o to w wypadku Log4Shell.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b5aa0cb6.png\" alt=\"\"\/><figcaption>Kto patchowa\u0142 Log4J w cyrku si\u0119 nie \u015bmieje.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b5aa0cb6.png\" alt=\"\"\/><figcaption>Kto patchowa\u0142 Log4J w cyrku si\u0119 nie \u015bmieje.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li><a href=\"https:\/\/jfrog.com\/blog\/springshell-zero-day-vulnerability-all-you-need-to-know\/\">SpringShell (Spring4Shell) Zero-Day Vulnerability CVE-2022-22965 : All You Need To Know<\/a><\/li><li><a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2022-22965\">NVD - CVE-2022-22965<\/a><\/li><li><a href=\"https:\/\/github.com\/spring-projects\/spring-framework\/blob\/b595dc1dfad9db534ca7b9e8f46bb9926b88ab5a\/spring-beans\/src\/main\/java\/org\/springframework\/beans\/CachedIntrospectionResults.java#L290\">https:\/\/github.com\/spring-projects\/spring-framework\/blob\/b595dc1dfad9db534ca7b9e8f46bb9926b88ab5a\/spring-beans\/src\/main\/java\/org\/springframework\/beans\/CachedIntrospectionResults.java#L290<\/a><\/li><\/ul>\n","innerContent":["\n<ul><li><a href=\"https:\/\/jfrog.com\/blog\/springshell-zero-day-vulnerability-all-you-need-to-know\/\">SpringShell (Spring4Shell) Zero-Day Vulnerability CVE-2022-22965 : All You Need To Know<\/a><\/li><li><a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2022-22965\">NVD - CVE-2022-22965<\/a><\/li><li><a href=\"https:\/\/github.com\/spring-projects\/spring-framework\/blob\/b595dc1dfad9db534ca7b9e8f46bb9926b88ab5a\/spring-beans\/src\/main\/java\/org\/springframework\/beans\/CachedIntrospectionResults.java#L290\">https:\/\/github.com\/spring-projects\/spring-framework\/blob\/b595dc1dfad9db534ca7b9e8f46bb9926b88ab5a\/spring-beans\/src\/main\/java\/org\/springframework\/beans\/CachedIntrospectionResults.java#L290<\/a><\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>3. Hibernate 6.0 - pierwsze du\u017ce wydanie od dekady<\/h2>\n","innerContent":["\n<h2>3. Hibernate 6.0 - pierwsze du\u017ce wydanie od dekady<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oj, wysypa\u0142o nam ostatnio nowych \u201cdu\u017cych\u201d wyda\u0144 od projekt\u00f3w, kt\u00f3re nie by\u0142y aktualizowane od dobrych par\u0119 lat. W zesz\u0142y poniedzia\u0142ek informowali\u015bmy o nowym Clojure, w czwartek o React 18, a dzisiaj mamy Hibernate 6.0 - edycj\u0119, kt\u00f3ra jest pierwszym \u201cmajorem\u201d Hibernate od roku 2011 \ud83d\ude09. Nie oznacza to oczywi\u015bcie, \u017ce rozw\u00f3j biblioteki sta\u0142 w miejscu - ka\u017cda z regularnie wydawanych minor\u00f3w 5.x przynosi\u0142a nowo\u015bci. Ostatnimi czasy jednak nie tylko wi\u0119cej m\u00f3wi\u0142o si\u0119 o pobocznych projektach, takich jak Hibernate Reactive, ale i sama biblioteka nie przynosi\u0142 pozytywnych (a w najlepszym wypadku - neutralne) skojarzenia. Czy \u201csz\u00f3stka\u201d ma szans\u0119 pom\u00f3c odzyska\u0107 Hibernate zal\u015bni\u0107 na nowo?<\/p>\n","innerContent":["\n<p>Oj, wysypa\u0142o nam ostatnio nowych \u201cdu\u017cych\u201d wyda\u0144 od projekt\u00f3w, kt\u00f3re nie by\u0142y aktualizowane od dobrych par\u0119 lat. W zesz\u0142y poniedzia\u0142ek informowali\u015bmy o nowym Clojure, w czwartek o React 18, a dzisiaj mamy Hibernate 6.0 - edycj\u0119, kt\u00f3ra jest pierwszym \u201cmajorem\u201d Hibernate od roku 2011 \ud83d\ude09. Nie oznacza to oczywi\u015bcie, \u017ce rozw\u00f3j biblioteki sta\u0142 w miejscu - ka\u017cda z regularnie wydawanych minor\u00f3w 5.x przynosi\u0142a nowo\u015bci. Ostatnimi czasy jednak nie tylko wi\u0119cej m\u00f3wi\u0142o si\u0119 o pobocznych projektach, takich jak Hibernate Reactive, ale i sama biblioteka nie przynosi\u0142 pozytywnych (a w najlepszym wypadku - neutralne) skojarzenia. Czy \u201csz\u00f3stka\u201d ma szans\u0119 pom\u00f3c odzyska\u0107 Hibernate zal\u015bni\u0107 na nowo?<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b5b0429a.gif\" alt=\"\"\/><figcaption>All work (on Hibernate) and no play makes Jack a dull boy<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/06\/img_62a88b5b0429a.gif\" alt=\"\"\/><figcaption>All work (on Hibernate) and no play makes Jack a dull boy<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nowy Hibernate to przede wszystkim nowe adnotacje, kt\u00f3re porzuci\u0142y swoje XMLowe korzenie i doczeka\u0142y si\u0119 sporej ilo\u015bci zmian min. lepsze type-safety. Du\u017cym krokiem do przodu jest te\u017c Semantic Query Model (SQM) - nowy parser zapyta\u0144 o encje, kt\u00f3ry obs\u0142uguje zar\u00f3wno JPQL, jak i Criteria API. Nowy parser b\u0119dzie znacznie bardziej elastyczny, dzi\u0119ki czemu zapewniamy lepsz\u0105 translacj\u0119 zapyta\u0144 o encje w j\u0119zyku SQL. Dodatkowo, pojawi\u0142a si\u0119 poprawa wydajno\u015bci poprzez zmian\u0119 z odczytu kolumn po nazwie na odczyt wed\u0142ug pozycji w ramach ResultSetu oraz aktualizacja u\u017cywanego przez Hibernate parsera z ANTLR 2 na 4.<\/p>\n","innerContent":["\n<p>Nowy Hibernate to przede wszystkim nowe adnotacje, kt\u00f3re porzuci\u0142y swoje XMLowe korzenie i doczeka\u0142y si\u0119 sporej ilo\u015bci zmian min. lepsze type-safety. Du\u017cym krokiem do przodu jest te\u017c Semantic Query Model (SQM) - nowy parser zapyta\u0144 o encje, kt\u00f3ry obs\u0142uguje zar\u00f3wno JPQL, jak i Criteria API. Nowy parser b\u0119dzie znacznie bardziej elastyczny, dzi\u0119ki czemu zapewniamy lepsz\u0105 translacj\u0119 zapyta\u0144 o encje w j\u0119zyku SQL. Dodatkowo, pojawi\u0142a si\u0119 poprawa wydajno\u015bci poprzez zmian\u0119 z odczytu kolumn po nazwie na odczyt wed\u0142ug pozycji w ramach ResultSetu oraz aktualizacja u\u017cywanego przez Hibernate parsera z ANTLR 2 na 4.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Bardzo du\u017c\u0105 zmian\u0105 jest te\u017c migracja Hibernate na Jakart\u0119 EE i porzucenie starych API zwi\u0105zanych z Java EE. To w\u0142a\u015bnie min. z tym wi\u0105\u017ce si\u0119 podbicie du\u017cej wersji aplikacji - z wiadomych wzgl\u0119d\u00f3w, pojawia si\u0119 potrzeba migracji z przestrzeni nazw javax.persistence do jakarta.persistence. Na szcz\u0119\u015bcie powsta\u0142 do tego specjalny <a href=\"https:\/\/github.com\/eclipse\/transformer\">automatyczny Transformer<\/a>.<\/p>\n","innerContent":["\n<p>Bardzo du\u017c\u0105 zmian\u0105 jest te\u017c migracja Hibernate na Jakart\u0119 EE i porzucenie starych API zwi\u0105zanych z Java EE. To w\u0142a\u015bnie min. z tym wi\u0105\u017ce si\u0119 podbicie du\u017cej wersji aplikacji - z wiadomych wzgl\u0119d\u00f3w, pojawia si\u0119 potrzeba migracji z przestrzeni nazw javax.persistence do jakarta.persistence. Na szcz\u0119\u015bcie powsta\u0142 do tego specjalny <a href=\"https:\/\/github.com\/eclipse\/transformer\">automatyczny Transformer<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>A skoro ju\u017c o tym m\u00f3wimy, nie mo\u017cna nie wspomnie\u0107 o nowej wersji Jakarty Persistence. Standard b\u0119d\u0105cy kontynuacj\u0105 znanego pewnie wi\u0119kszo\u015bci JPA (Java Persistence API) ukaza\u0142 <a href=\"https:\/\/newsroom.eclipse.org\/eclipse-newsletter\/2022\/march\/what%E2%80%99s-new-jakarta-persistence-31\">si\u0119 w wersji 3.1<\/a>, kt\u00f3ra to stanie si\u0119 cz\u0119\u015bci\u0105 nadchodz\u0105cej Jakarty EE 10. Ta przynosi porz\u0105dne wsparcie dla UUID (java.util.UUID wreszcie jest traktowane jako typ podstawowy), rozwini\u0119cie Query Language and Criteria API. Pojawi\u0142y si\u0119 te\u017c nowe funkcje numeryczne (jak FLOOR czy ROUND), lepsze wsparcie dla LocalDate oraz wyci\u0105ganie konkretnych fragment\u00f3w daty za pomoc EXTRACT z SQL.<\/p>\n","innerContent":["\n<p>A skoro ju\u017c o tym m\u00f3wimy, nie mo\u017cna nie wspomnie\u0107 o nowej wersji Jakarty Persistence. Standard b\u0119d\u0105cy kontynuacj\u0105 znanego pewnie wi\u0119kszo\u015bci JPA (Java Persistence API) ukaza\u0142 <a href=\"https:\/\/newsroom.eclipse.org\/eclipse-newsletter\/2022\/march\/what%E2%80%99s-new-jakarta-persistence-31\">si\u0119 w wersji 3.1<\/a>, kt\u00f3ra to stanie si\u0119 cz\u0119\u015bci\u0105 nadchodz\u0105cej Jakarty EE 10. Ta przynosi porz\u0105dne wsparcie dla UUID (java.util.UUID wreszcie jest traktowane jako typ podstawowy), rozwini\u0119cie Query Language and Criteria API. Pojawi\u0142y si\u0119 te\u017c nowe funkcje numeryczne (jak FLOOR czy ROUND), lepsze wsparcie dla LocalDate oraz wyci\u0105ganie konkretnych fragment\u00f3w daty za pomoc EXTRACT z SQL.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n","innerContent":["\n<h3>\u0179r\u00f3d\u0142a<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li><a href=\"https:\/\/github.com\/eclipse\/transformer\">https:\/\/github.com\/eclipse\/transformer<\/a><\/li><li><a href=\"https:\/\/newsroom.eclipse.org\/eclipse-newsletter\/2022\/march\/what%E2%80%99s-new-jakarta-persistence-31\">https:\/\/newsroom.eclipse.org\/eclipse-newsletter\/2022\/march\/what%E2%80%99s-new-jakarta-persistence-31<\/a><\/li><li><a href=\"https:\/\/in.relation.to\/2022\/03\/31\/orm-60-final\/\">https:\/\/in.relation.to\/2022\/03\/31\/orm-60-final\/<\/a><\/li><\/ul>\n","innerContent":["\n<ul><li><a href=\"https:\/\/github.com\/eclipse\/transformer\">https:\/\/github.com\/eclipse\/transformer<\/a><\/li><li><a href=\"https:\/\/newsroom.eclipse.org\/eclipse-newsletter\/2022\/march\/what%E2%80%99s-new-jakarta-persistence-31\">https:\/\/newsroom.eclipse.org\/eclipse-newsletter\/2022\/march\/what%E2%80%99s-new-jakarta-persistence-31<\/a><\/li><li><a href=\"https:\/\/in.relation.to\/2022\/03\/31\/orm-60-final\/\">https:\/\/in.relation.to\/2022\/03\/31\/orm-60-final\/<\/a><\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p><\/p>\n","innerContent":["\n<p><\/p>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/9987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/comments?post=9987"}],"version-history":[{"count":1,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/9987\/revisions"}],"predecessor-version":[{"id":10512,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/9987\/revisions\/10512"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/8017"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=9987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=9987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=9987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}