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.


$config[zx-auto] not found$config[zx-overlay] not found