Bevezetés a Smooks-ba
1. Áttekintés
Ebben az oktatóanyagban bemutatjuk a Smooks keretrendszert.
Leírjuk, mi ez, felsoroljuk a legfontosabb jellemzőit, és végül megtanuljuk, hogyan kell használni néhány fejlettebb funkcióját.
Először is, röviden magyarázzuk el, mit akarunk elérni a keretrendszerrel.
2. Smooks
A Smooks egy keretrendszer az adatfeldolgozó alkalmazások számára - olyan strukturált adatokkal foglalkozik, mint az XML vagy a CSV.
Mind API-kat, mind konfigurációs modellt biztosít, amelyek lehetővé teszik az előre definiált formátumok közötti transzformációk meghatározását (például XML-től CSV-ig, XML-től JSON-ig és így tovább).
Számos eszközt használhatunk a leképezés beállításához - ideértve a FreeMarker vagy a Groovy szkripteket is.
Az átalakítások mellett a Smooks más funkciókat is kínál, például az üzenetek ellenőrzését vagy az adatok felosztását.
2.1. Főbb jellemzők
Vessünk egy pillantást a Smooks főbb használati eseteire:
- Üzenetkonverzió - az adatok átalakítása különböző forrásformátumokból különböző kimeneti formátumokká
- Üzenetdúsítás - az üzenet kitöltése további adatokkal, amelyek külső adatforrásokból származnak, például adatbázisból
- Adatok felosztása - nagy fájlok (GB) feldolgozása és kisebbekre bontása
- Java kötés - Java objektumok szerkesztése és feltöltése üzenetekből
- Üzenetellenőrzés - olyan ellenőrzések végrehajtása, mint a regex, vagy akár saját ellenőrzési szabályok létrehozása
3. Kezdeti konfigurálás
Kezdjük azzal a Maven-függőséggel, amelyet hozzá kell adnunk a sajátunkhoz pom.xml:
org.milyn milyn-smooks-all 1.7.0
A legújabb verzió megtalálható a Maven Central oldalon.
4. Java kötés
Kezdjük azzal, hogy az üzenetek Java osztályokhoz való kötésére összpontosítunk. Itt egy egyszerű XML-Java átalakítást hajtunk végre.
4.1. Alapfogalmak
Kezdjük egy egyszerű példával. Vegye figyelembe a következő XML-t:
771 IN_PROGRESS
Annak érdekében, hogy ezt a feladatot a Smooks segítségével teljesítsük, két dolgot kell tennünk: elő kell készítenünk a POJO-kat és a Smooks konfigurációt.
Lássuk, hogyan néz ki a modellünk:
public class Megrendelés {private Date creationDate; privát Hosszú szám; privát státusz státusz; // ...}
public enum állapota {ÚJ, IN_PROGRESS, FINISHED}
Most térjünk át a Smooks leképezésekre.
Alapvetően a leképezések egy XML fájlok, amelyek transzformációs logikát tartalmaznak. Ebben a cikkben három különböző típusú szabályt fogunk használni:
- bab - meghatározza egy konkrét strukturált szakasz hozzárendelését a Java osztályhoz
- érték - meghatározza a bab adott tulajdonságának leképezését. Tartalmazhat fejlettebb logikát, például dekódereket, amelyeket bizonyos adattípusok (például dátum vagy tizedes formátum) értékeinek leképezésére használnak
- wiring - lehetővé teszi számunkra, hogy babot kössünk más babokhoz (például Támogató bab lesz bekötve Rendelés bab)
Vessünk egy pillantást a hozzárendelésekre, amelyeket a mi esetünkben itt fogunk használni:
éééé-hh-nn
Most, miután a konfiguráció készen áll, próbáljuk meg kipróbálni, hogy a POJO-nk megfelelően van-e felépítve.
Először létre kell hoznunk egy Smooks objektumot, és az XML bemenetet továbbítanunk kell adatfolyamként:
public Order converOrderXMLToOrderObject (karakterlánc útvonala) dobja az IOException, SAXException {Smooks smooks = new Smooks (this.class.getResourceAsStream ("/ smooks-mapping.xml")); próbáld ki {JavaResult javaResult = new JavaResult (); smooks.filterSource (új StreamSource (this.class .getResourceAsStream (elérési út)), javaResult); return (Rendelés) javaResult.getBean ("rendelés"); } végül {smooks.close (); }}
És végül állítsa be, hogy a konfiguráció megfelelően történt-e:
@Test public void givenOrderXML_whenConvert_thenPOJOsConstrucedCorrectly () dobja a Kivételt {XMLToJavaConverter xmlToJavaOrderConverter = új XMLToJavaConverter (); Rendelési sorrend = xmlToJavaOrderConverter .converOrderXMLToOrderObject ("/ order.xml"); assertThat (order.getNumber (), (771L)); assertThat (order.getStatus (), van (Status.IN_PROGRESS)); assertThat (order.getCreationDate (), is (új SimpleDateFormat ("éééé-hh-nn"). elemzés ("2018-01-14"));}
4.2. Haladó kötés - hivatkozás más babokra és listákra
Bővítsük az előző példánkat támogató és rendelési cikkek címkék:
771 IN_PROGRESS X vállalat X 1234567 1 PX1234
9.99 1 RX990
120.32
Most pedig frissítsük a modellünket:
public class Megrendelés {// .. magánszállító beszállító; privát listaelemek; // ...}
public class Item {private String code; magán Dupla ár; privát egész szám; // ...}
public class Beszállító {private String name; privát karakterlánc telefonszám; // ...}
Ki kell terjesztenünk a konfigurációs leképezést a támogató és tétel babdefiníciók.
Figyelje meg, hogy mi is elválasztva definiáltuk elemeket bab, amely mindent el fog tartani tétel elemek Tömb lista.
Végül a Smooks alkalmazást fogjuk használni vezeték attribútumot, hogy az egészet összevonja.
Vessen egy pillantást arra, hogyan fog kinézni a leképezések ebben az esetben:
éééé-hh-nn
Végül hozzáadunk néhány állítást az előző tesztünkhöz:
assertThat (order.getSupplier (), is (új szállító ("X vállalat," 1234567 "))); assertThat (order.getItems (), tartalmazzaInAnyOrder (új elem ("PX1234", 9.99,1), új elem ("RX990", 120.32,1)));
5. Üzenetek érvényesítése
A Smooks szabályokon alapuló ellenőrzési mechanizmussal rendelkezik. Vessünk egy pillantást azok használatára.
A szabályok meghatározása a konfigurációs fájlban tárolódik, beágyazva a ruleBases tag, amely sokakat tartalmazhat ruleBase elemek.
Minden egyes ruleBase elemnek a következő tulajdonságokkal kell rendelkeznie:
- név - egyedi név, csak hivatkozásként használják
- src - elérési út a szabály forrásfájljához
- szolgáltató - teljesen minősített osztálynév, amely megvalósítja RuleProvider felület
A Smooks két szolgáltatóval van felszerelve: RegexProvider és MVELProvider.
Az elsőt az egyes mezők regexszerű stílusú érvényesítésére használják.
A másodikat bonyolultabb érvényesítésre használják a dokumentum globális terjedelmében. Lássuk őket működés közben.
5.1. RegexProvider
Használjuk RegexProvider két dolog érvényesítéséhez: az ügyfélnév formátumához és a telefonszámhoz. RegexProvider forrásként Java tulajdonságfájlt igényel, amely kulcsértékű módon kell tartalmaznia a regex érvényesítést.
A követelmények teljesítése érdekében a következő beállítást fogjuk használni:
szállítóNév = [A-Za-z0-9] * beszállítóPhone = ^ [0-9 \ - \ +] {9,15} $
5.2. MVELProvider
Majd használjuk MVELProvider érvényesíteni, ha a teljes ár mindegyikre rendelési tétel forrásnál kevesebb, mint 200. Forrásként elkészítünk egy CSV fájlt, amely két oszlopot tartalmaz: a szabály nevét és az MVEL kifejezést.
Annak ellenőrzéséhez, hogy az ár helyes-e, a következő bejegyzésre van szükségünk:
"max_total", "orderItem.quantity * orderItem.price <200,00"
5.3. Ellenőrzés konfigurációja
Miután elkészítettük a forrásfájlokat ruleBases, áttérünk a konkrét érvényesítések végrehajtására.
Az érvényesítés egy másik címke a Smooks konfigurációjában, amely a következő attribútumokat tartalmazza:
- executeOn - az érvényesített elem elérési útja
- név - hivatkozás a ruleBase
- onFail - meghatározza, hogy mi fog történni, ha az érvényesítés sikertelen
Alkalmazzunk érvényesítési szabályokat a Smooks konfigurációs fájlunkra, és ellenőrizzük, hogy néz ki (vegye figyelembe, hogy ha a MVELProvider, kénytelenek vagyunk a Java-összerendelést használni, ezért importáltuk a korábbi Smooks-konfigurációkat):
Most, miután a konfiguráció készen áll, próbáljuk meg kipróbálni, hogy a hitelesítés nem sikerül-e a szállító telefonszámán.
Ismét meg kell építenünk Smooks objektum és továbbítja az XML bemenetet adatfolyamként:
public ValidationResult validate (String path) dobja az IOException, SAXException {Smooks smooks = new Smooks (OrderValidator.class .getResourceAsStream ("/ smooks / smooks-validation.xml")); próbáld ki a {StringResult xmlResult = new StringResult () parancsot; JavaResult javaResult = new JavaResult (); ValidationResult validationResult = new ValidationResult (); smooks.filterSource (új StreamSource (OrderValidator.class .getResourceAsStream (elérési út)), xmlResult, javaResult, validationResult); return validationResult; } végül {smooks.close (); }}
És végül állítsa, ha érvényesítési hiba történt:
@Test public void givenIncorrectOrderXML_whenValidate_thenExpectValidationErrors () dobja a Kivételt {OrderValidator orderValidator = új OrderValidator (); ValidationResult validationResult = orderValidator .validate ("/ smooks / order.xml"); assertThat (validationResult.getErrors (), hasSize (1)); assertThat (validationResult.getErrors (). get (0) .getFailRuleResult (). getRuleName (), is ("szolgáltatóPhone")); }
6. Üzenetkonvertálás
A következő dolog, amit meg akarunk tenni: az üzenet konvertálása egyik formátumból a másikba.
A Smooks-ban ezt a technikát sablonnak is nevezik és támogatja:
- FreeMarker (előnyben részesített lehetőség)
- XSL
- Húr sablon
Példánkban a FreeMarker motort használjuk arra, hogy az XML üzeneteket az EDIFACT-hoz nagyon hasonlóra konvertálja, és még az XML sorrend alapján elkészítsünk egy sablont az e-mailhez.
Nézzük meg, hogyan készítsünk sablont az EDIFACT-hoz:
UNA: +.? 'UNH + $ {order.number} + $ {order.status} + $ {order.creationDate? Date}' CTA + $ {szállítónév} + $ {beszállító.telefonNumber} 'LIN + $ {item.quantity} + $ { item.code} + $ {item.price} '
És az e-mail üzenethez:
Helló, a (z) $ {order.creationDate? Date} napon létrehozott # $ {order.number} számú megrendelés jelenleg $ {order.status} állapotban van. Vegye fontolóra a (z) "$ {Supplier.name}" szállítóhoz való telefonszámot: "$ {Supplier.phoneNumber}". Rendelési elemek: $ {item.quantity} X $ {item.code} (teljes ár $ {item.price * item.quantity})
A Smooks konfiguráció ezúttal nagyon egyszerű (ne felejtse el importálni az előző konfigurációt a Java összerendelési beállítások importálásához):
/path/to/template.ftl
Ezúttal csak át kell adnunk a StringResult a Smooks motorhoz:
Smooks smooks = new Smooks (config); StringResult stringResult = new StringResult (); smooks.filterSource (új StreamSource (OrderConverter.class .getResourceAsStream (elérési út)), stringResult); return stringResult.toString ();
És természetesen kipróbálhatjuk:
@Test public void givenOrderXML_whenApplyEDITemplate_thenConvertedToEDIFACT () dobja a Kivételt {OrderConverter orderConverter = new OrderConverter (); Karakterlánc edifact = orderConverter.convertOrderXMLtoEDIFACT ("/smooks/order.xml"); assertThat (edifact, az (EDIFACT_MESSAGE)); }
7. Következtetés
Ebben az oktatóanyagban arra összpontosítottunk, hogyan konvertálhatunk üzeneteket különböző formátumokra, vagy hogyan alakíthatjuk át Java-objektumokká a Smooks segítségével. Láttuk azt is, hogyan kell végrehajtani a regex vagy az üzleti logika szabályai alapján az érvényesítéseket.
Mint mindig, az itt használt összes kód megtalálható a GitHubon.