Hibernált Validator-specifikus korlátozások
1. Áttekintés
Ebben az oktatóanyagban áttekintjük a Hibernate Validator korlátozásait, amelyek a Hibernate Validatorba vannak beépítve, de kívül esnek a Bean Validation specifikáción.
A babellenőrzés összefoglalását lásd a Java babellenőrzés alapjairól szóló cikkünkben.
2. A hibernált Validator beállítása
Legalábbis, hozzá kell adnunk a Hibernate Validator függőségeinkhez:
org.hibernate.validator hibernate-validator 6.0.16.Final
Ne feledje, hogy a Hibernate Validator nem függ a Hibernate-től, az ORM-től, amellyel számos más cikkben foglalkozunk.
Ezenkívül néhány bevezetett jegyzet csak akkor érvényes, ha projektünk bizonyos könyvtárakat használ. Tehát mindegyiknél feltüntetjük a szükséges függőségeket.
3. Pénzzel kapcsolatos értékek érvényesítése
3.1. Hitelkártyaszámok érvényesítése
Az érvényes hitelkártyaszámoknak meg kell felelniük az ellenőrző összegnek, amelyet a Luhn-algoritmus segítségével számolunk ki. A @Bankkártya száma a kényszer akkor sikerül, amikor a karakterlánc kielégíti az ellenőrző összeget.
@Bankkártya száma nem végez más ellenőrzést a bemeneti karakterláncon. Különösen nem ellenőrzi a bemenet hosszát. Ezért csak olyan számokat képes felismerni, amelyek egy kis elírás miatt érvénytelenek.
Ne feledje, hogy a korlátozás alapértelmezés szerint kudarcot vall, ha a karakterlánc nem számjegyű karaktereket tartalmaz, de mondhatjuk neki, hogy figyelmen kívül hagyja őket:
@CreditCardNumber (ignoreNonDigitCharacters = true) private String lenientCreditCardNumber;
Ezután felvehetünk olyan karaktereket, mint szóköz vagy kötőjel:
validations.setLenientCreditCardNumber ("7992-7398-713"); constraintViolations = validator.validateProperty (érvényesítések, "lenientCreditCardNumber"); assertTrue (kényszerViolations.isEmpty ());
3.2. A monetáris értékek érvényesítése
A @Valuta az érvényesítő ellenőrzi, hogy egy adott pénzösszeg a megadott pénznemben van-e:
@Currency ("EUR") privát MonetaryAmount egyenleg;
Osztály MonetaryAmount a Java Money része. Ebből kifolyólag, @Valuta csak akkor érvényes, ha elérhető a Java Money implementáció.
Miután helyesen beállítottuk a Java Money-t, ellenőrizhetjük a korlátozást:
bean.setBalance (Money.of (új BigDecimal (100.0), Monetary.getCurrency ("EUR"))); constraintViolations = validator.validateProperty (bab, "egyensúly"); assertEquals (0, constraintViolations.size ());
4. A tartományok érvényesítése
4.1. Numerikus és monetáris tartományok
A babellenőrzés specifikációja számos korlátozást határoz meg, amelyeket érvényesíthetünk a numerikus mezőkön. Ezek mellett a Hibernate Validator praktikus feljegyzéssel szolgál, @Hatótávolság, azt kombinációjaként működik @Min és @Max,egy tartomány beillesztése:
@ Tartomány (min = 0, max = 100) privát BigDecimal százalék;
Mint @Min és @Max, @Hatótávolság a primitív számtípusok mezőire és azok burkolóira alkalmazható; BigInteger és BigDecimal, Húr a fentiek ábrázolása, és végül Pénzbeli érték mezők.
4.2. Az időtartam
A Hibernate Validator a JSR 380 szabványos kommentárjain kívül az idõpontokat jelentõ értékekhez tartalmaz korlátozásokat a Időtartams ugyanúgy. Ügyeljen arra, hogy megnézze a Időszak és Időtartam először a Java Time osztályok.
Így, minimális és maximális időtartamot érvényesíthetünk egy ingatlanon:
@DurationMin (nap = 1, óra = 2) @ DurationMax (nap = 2, óra = 1) privát Időtartam;
Még ha itt sem is mutattuk meg mindet, az annotációnak paraméterei vannak az összes időegységre, a nanoszekundumoktól a napokig.
Felhívjuk figyelmét, hogy alapértelmezés szerint a minimum és maximum értékek magukban foglalják. Vagyis egy olyan érték, amely pontosan megegyezik a minimummal vagy a maximummal, átmegy az érvényesítésen.
Ha azt akarjuk, hogy a határértékek érvénytelenek legyenek, akkor megadjuk a befogadó tulajdonság hamis:
@DurationMax (perc = 30, beleértve = hamis)
5. Húrok érvényesítése
5.1. Karakterlánc hossza
Két kissé eltérő korlátozást alkalmazhatunk arra, hogy a karakterlánc bizonyos hosszúságú legyen.
Általában biztosítani akarjuk a karakterlánc hosszát karakterekben - azt, amelyet a hossz módszer - minimum és maximum között van. Ebben az esetben használjuk @Hossz karakterlánc tulajdonságán vagy mezőjén:
@Length (min = 1, max = 3) private String someString;
Az Unicode bonyolultsága miatt azonban néha a karakteres hosszúság és a kódpontokban megadott hossz eltér. Amikor az utóbbit akarjuk ellenőrizni, akkor használjuk @CodePointLength:
@CodePointLength (min = 1, max = 3) privát karakterlánc someString;
Például az „aa \ uD835 \ uDD0A” karaktersorozat 4 karakter hosszú, de csak 3 kódpontot tartalmaz, így az első korlátozást kudarcot vallja, a másodikat pedig átengedi.
Ezenkívül mindkét megjegyzéssel elhagyhatjuk a minimum vagy a maximum értéket.
5.2. A számjegyek karakterláncainak ellenőrzése
Már láttuk, hogyan lehet ellenőrizni, hogy a karakterlánc érvényes hitelkártyaszám. A Hibernate Validator azonban számos más korlátozást tartalmaz a számjegyek karakterláncaira vonatkozóan.
Az első, amelyet átnézünk, az @LuhnCheck. Ez a @Bankkártya száma, abban ugyanazt az ellenőrzést hajtja végre, de további paramétereket tesz lehetővé:
@LuhnCheck (startIndex = 0, endIndex = Integer.MAX_VALUE, checkDigitIndex = -1) privát karakterlánc someString;
Itt bemutattuk a paraméterek alapértelmezett értékeit, így a fentiek egyenértékűek egy egyszerűvel @LuhnCheck annotáció.
De, mint láthatjuk, elvégezhetjük az ellenőrzést egy szubstringen (startIndex és endIndex), és mondja meg a megszorításnak, hogy melyik számjegy az ellenőrző összeg számjegye, -1 jelentése az utolsó az ellenőrzött részstringben.
További érdekes korlátok közé tartozik a modulo 10 check (@ Mod10Check) és a modulo 11 ellenőrzés (@ Mod11Check), amelyeket általában vonalkódokhoz és más kódokhoz, például ISBN-hez használnak.
Azonban ezekben a speciális esetekben a Hibernate Validator véletlenül korlátozást nyújt az ISBN-kódok érvényesítésére, @ISBN, valamint egy @EAN korlátozás az EAN vonalkódok számára.
5.3. URL és HTML ellenőrzés
A @Url a kényszer ellenőrzi, hogy a karakterlánc az URL érvényes reprezentációja. Ezenkívül ellenőrizhetjük, hogy az URL adott összetevője rendelkezik-e bizonyos értékkel:
@URL (protokoll = "https") privát karakterlánc URL;
Így ellenőrizhetjük a protokollt, a gazdagépet és a portot. Ha ez nem elegendő, van egy regexp tulajdonság, amelyet felhasználhatunk az URL és egy reguláris kifejezés összehangolásához.
Azt is ellenőrizhetjük, hogy egy tulajdonság „biztonságos” HTML-kódot tartalmaz-e (például szkriptcímkék nélkül):
@SafeHtml private String html;
@SafeHtml a JSoup könyvtárat használja, amelyet fel kell venni a függőségeinkbe.
A HTML-fertőtlenítést az igényeinkhez szabhatjuk beépített címkefehér listák (a engedélyezőlista tulajdonság a megjegyzésben), és további címkéket és attribútumokat ( additionalTags és additionalTagsWithAttributes paraméterek).
6. Egyéb korlátozások
Röviden említsük meg, hogy a Hibernate Validator tartalmaz néhány ország- és területspecifikus korlátozást, különösen néhány brazil és lengyel azonosító számra, adófizetői kódra és hasonlóra. A teljes listát a dokumentáció vonatkozó szakaszában találja.
Azt is ellenőrizhetjük, hogy egy gyűjtemény nem tartalmaz-e másolatot a @UniqueElements.
Végül, olyan összetett esetekre, amelyekre a meglévő kommentárok nem terjednek ki, meghívhatunk egy JSR-223 kompatibilis szkript motorban írt szkriptet. Természetesen megérintettük a JSR-223-at a Nashornról szóló cikkünkben, a modern JVM-ekbe beépített JavaScript-implementációban.
Ebben az esetben az annotáció osztályszintű, és a parancsfájl az egész példányon meghívásra kerül, mint változó _ez:
@ScriptAssert (lang = "nashorn", script = "_this.valid") public class AdditionalValidations {privát logikai érték érvényes = true; // szabványos mérőeszközök és beállítók}
Ezután ellenőrizhetjük a korlátozást az egész példányon:
bab.setValid (hamis); constraintViolations = validator.validate (bab); assertEquals (1, constraintViolations.size ());
7. Következtetés
Ebben a cikkben felsoroltuk azokat a korlátozásokat a Hibernate Validator programban, amelyek meghaladják a babellenőrzés specifikációjában meghatározott minimális halmazt.
Ezen példák és kódrészletek megvalósítása megtalálható a GitHub-on.