Spring Security frissítés

Technológiák: Spring Boot 2.1.3.RELEASE, Spring Security, Thymeleaf, Spring Data JPA, H2, Flyway

Frissítettem a Spring Security cikkemet a legfrissebb Java 11, Spring Framework 5.1.5 és Spring Security 5.1.4 verziókra.

A poszthoz tartozó Spring Security példa projekt elérhető a GitHubon.

Azonban mivel már új projektet kizárólag Spring Boottal érdemes kezdeni, ugyanezen alkalmazást elkészítettem Spring Boottal is. A Spring Security Spring Boottal példa projekt szintén elérhető a GitHubon.

Most nézzük meg a két projekt közötti hasonlóságokat és különbségeket.

Clean Code könyv Args példájának újragondolása

Azt hiszem, abban megegyezhetünk, hogy Robert C. Martin: Clean Code könyvét minden programozónak el kell olvasnia. A könyv szinte a fejlesztők bibliájává vált, vannak cégek, ahol a céges kódolási konvenciók kimondják a könyvben található szabályok és iránymutatások betartását. (A könyv megjelent magyarul is Tiszta kód címmel.)

Clean Code könyv

A könyvnek a 14. fejezete Successive Refinement címen tartalmaz egy esettanulmányt. Egy olyan kódrészletet kell írni, melynek meg lehet adni, hogy a program milyen parancssori paramétereket vár, majd elemzi azokat. A fejezet egyből a jó megoldással indít, majd leírja, hogy folyamatos finomítással hogyan alakult ki a végleges kód, és milyen refaktoring eljárásokat alkalmazott. A fejezetet ugyan viszonylag gyorsan át lehet olvasni, azonban ha az ember komolyan át szeretné gondolni, megérteni, sok időt el lehet vele tölteni. Mivel a kódot átolvasva többször elgondolkoztam rajta, hogy vajon én hogyan írnám meg, a végén úgy döntöttem, hogy megírom a teljes feladatot.

A megoldás során a következőket tartottam szem előtt. Mivel a kódhoz adottak voltak tesztesetek, tesztvezérelt módon fejleszthettem, garantálva, hogy a megoldásom a könyvben szereplő megoldással ekvivalens lesz. Mivel a tesztelés mostanában különösen kedves nekem, átgondoltam a könyvben szereplő teszteseteket, keresve, hogy vannak-e hiányosságok, kihagyott tesztesetek. Nem ragaszkodtam teljes mértékben az API-hoz, ha valahol módosítást láttam jónak, megtettem. A legfrissebb technológiákat használtam, mint a Java 11, JUnit 5 és Maven.

És a legfontosabb, hogy összegyűjtöttem a tapasztalatokat és tanulságokat, mind magamnak, mind nektek, hogy többen tanulni tudjunk belőle. Mindenkinek javaslom, hogy a feladat leírása alapján próbálja meg maga is implementálni.

A megoldásom megtalálható a GitHubon.

Learn webservices

Főleg a webszolgáltatások oktatáskor, de valamilyen technológia kipróbálásakor, prototípusok készítésekor sokszor belefutottam abba a problémába, hogy nem találtam megfelelő publikusan elérhető, ingyenes használható webszolgáltatást. Ha találtam is, esetleg regisztrálni kellett, vagy valamilyen tokent megszerezni. Hol működött, hol nem, elég sok időközben meg is szűnt.

Ezért úgy döntöttem, hogy készítek egy oldalt, ahol publikussá teszek több egyszerű webszolgáltatást, hogy meg lehessen nézni, mi is ez, gyorsan használatba lehessen venni. Amennyiben oktatom, vagy valamit szeretnék kipróbálni, rögtön legyen egy kéznél.

Eléritek a http://www.learnwebservices.com címen.

Nyugodtan használjátok ti is. Sőt használhatják oktató anyagokban, videókban, blog posztokban, hiszen a célom, hogy hosszú távon működjön, és mindig elérhető legyen.

Az oldal és a webszolgáltatások forráskódja elérhető a GitHubon. Sőt, az oldalon nem csak egy működő webszolgáltatás található, hanem egyrészt egy rövid animáció, hogy hogy lehet SoapUI-ból tesztelni, valamint webszolgáltatás kliens programok, forráskóddal, különböző programozási nyelvekben (Java, Python, JavaScript, C#).

Az oldal érdekessége, hogy az oldal tartalmaz egy JavaScript kódot is, mely meghívja a webszolgáltatást, így ellenőrizve, hogy működik-e, és azonnal kiírja annak elérhetőségét. Valamint egy űrlapot kitöltve és elküldve is meg lehet hívni a webszolgáltatást.

Learn webservices site

Egy WSDL fájl formázottan is elérhető, valamint a címe egy gombnyomással vágólapra helyezhető.

Az oldal elérhető angol és magyar nyelven is.

Python build és Continuous Integration

Technológiák: Python 3, venv, pip, make, pytest, coverage, pytest-cov, pylint, SonarQube, Jenkins

Frissítve: 2018. december 14.

Amint az mér egy korábbi posztból kiderülhetett, a Java mellett a Python az egyik kedvenc programozási nyelvem, ráadásul mostanában sok inspirációt és motivációt kapok, hogy foglalkozzam vele, egészen a nyelvi alapoktól (például az objektumorientáltság is) egy teljes projekt felépítéséig.

A Python nézetem szerint különösen alkalmas nyelv a programozás oktatására, valamint a programozásba való bevezetésbe, sőt akár olyanoknak is megmutatható, akiknek csak érintőleges kapcsolata lesz a programozáshoz.

A Python nyelvvel kapcsolatban nagyon sok írást, könyvet, videót lehet találni, azonban arról, hogy hogyan építsünk fel egy projektet, milyen build eszközt használjunk, hogyan integráljuk Continuous Integration eszközbe, hogyan biztosítsuk a kódminőséget, valamint mindezt hogyan érjük el fejlesztőkörnyezetből, arról már sokkal kevesebb, és egymással ellenmondó (esetleg elavult) információt lehet találni.

Java esetén viszonylag egyszerű, a Maven, JUnit, Jacoco, Jenkins, SonarQube eszközökkel nem lehet hibázni. Python esetén kicsit színesebb a kép. Nem árulok el titkot, hogy a SonarQube, melyről nemrég írtam, Python forráskód elemzésére is alkalmas, így azt megtartom.

Ezen poszt összefoglalja, hogy ezzel kapcsolatban meddig jutottam a kutatással. Amennyiben tévedést találsz, esetleg jobb megoldásod van, kérlek ne késlekedj velem megosztani. Természetesen több megoldás is elképzelhető, tetszőlegesen bonyolítható, azonban próbáltam egy minimális eszközkészletet összetenni, ráadásul olyanokat összeválogatni, melyek kellően elterjedtek.

Spring tranzakciókezelés

Technológiák: Spring Framework, Spring Boot 2.0.5

Ezen poszt bemutatja a Spring tranzakciókezelés mélységeit, a propagációs tulajdonságokkal, valamint kivételkezeléssel.

Előtte érdemes elolvasni a Tranzakciókezelés EJB 3 és Spring környezetben című régebbi posztomat, mely az alapfogalmakat mutatja be.

A példában egy DAO/repository osztály egyik metódusa meghív egy másik osztály egy metódusát. Először nézzük meg, hogy mi történik alapértelmezett esetben, mikor az első osztály metódusa van ellátva @Transactional annotációval, és kivétel történik, akár az első, akár a második metódusban. Majd nézzük meg, hogy lehet megvalósítani, hogy a két metódus külön tranzakcióban fusson, azaz az egyikben keletkezett kivételnek ne legyen kihatása a másik metódus tranzakciójára.

A másik érdekesség az szokott lenni, hogy ugyan lekezeljük a kivételt, mégis rollback történik. Nézzük meg, hogy lehet ezt megakadályozni.

A kivetelkezeléssel kapcsolatba belefutottam a Spring Boot egy érdekes tulajdonságába is, ami a repository rétegben keletkező kivételeket átfordítja.