מדריך ל- JAXB

1. הקדמה

זהו מאמר מבוא על JAXB (Java Architecture for XML Binding).

ראשית נראה כיצד להמיר אובייקטים של Java ל- XML ​​ולהיפך, ואז נתמקד ביצירת שיעורי Java מסכמת XML ולהיפך באמצעות תוסף JAXB-2 Maven.

2. סקירה כללית

JAXB מספק דרך מהירה ונוחה למרשל (לכתוב) אובייקטים של Java לתוך XML ולבטל מארשל (לקרוא) XML לאובייקטים. הוא תומך במסגרת מחייבת הממפה אלמנטים XML ותכונות לשדות ומאפייני Java באמצעות הערות Java.

תוסף JAXB-2 Maven מאציל את מרבית עבודתו לאחד משני הכלים המסופקים על ידי JDK XJC ו- Schemagen.

3. הערות JAXB

JAXB משתמש בהערות Java לצורך הגדלת המחלקות שנוצרו במידע נוסף. הוספת הערות כאלה לשיעורי Java קיימים מכינה אותן לזמן הריצה של JAXB.

בואו ניצור תחילה אובייקט ג'אווה פשוט להמחשת התארגנות והפסקה:

@XmlRootElement (name = "book") @XmlType (propOrder = {"id", "name", "date"}) מחלקה ציבורית ספר {פרטי מזהה ארוך; שם מחרוזת פרטי; סופר מחרוזת פרטי; תאריך תאריך פרטי; @XmlAttribute ציבורי ריק setId (מזהה ארוך) {this.id = id; } @XmlElement (name = "title") set public name ריק (שם מחרוזת) {this.name = שם; } @XmlTransient public void setAuthor (מחרוזת מחבר) {this.author = author; } // קונסטרוקטור, גטרים וקובעים}

המחלקה לעיל מכילה את ההערות הבאות:

  • @XmlRootElement: שם שמו של רכיב ה- XML ​​הבסיסי נגזר משם המחלקה ואנו יכולים גם לציין את שם רכיב השורש של ה- XML ​​באמצעות תכונת השם שלו
  • @XmlType: הגדירו את סדר כתיבת השדות בקובץ ה- XML
  • @XmlElement: הגדר את שם רכיב ה- XML ​​בפועל בו ישמש
  • @Xml תכונה: הגדר את שדה id ממופה כתכונה במקום אלמנט
  • @XmlTransient: הערה לשדות שאיננו רוצים שייכללו ב- XML

לפרטים נוספים על ביאור JAXB, מומלץ לבדוק את הקישור הבא.

4. Marshalling - המרת אובייקט Java ל- XML

Marshalling מספק ליישום לקוח אפשרות להמיר עץ אובייקט Java שמקורו ב- JAXB לנתוני XML. כברירת מחדל, ה- מרשלר משתמש בקידוד UTF-8 בעת יצירת נתוני XML. לאחר מכן ניצור קבצי XML מאובייקטים של Java.

בואו ליצור תוכנית פשוטה באמצעות JAXBContext המספק הפשטה לניהול המידע המחייב של XML / Java הדרוש ליישום פעולות המסגרת המחייבות של JAXB:

מרשל חלל ציבורי () זורק JAXBException, IOException {ספר ספר = ספר חדש (); book.setId (1L); book.setName ("ספר 1"); book.setAuthor ("מחבר 1"); book.setDate (תאריך חדש ()); הקשר JAXBContext = JAXBContext.newInstance (Book.class); מרשלר מאר = context.createMarshaller (); mar.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, בוליאני. TRUE); mar.marshal (ספר, קובץ חדש ("./ book.xml")); }

ה javax.xml.bind.JAXBContext class מספק נקודת כניסה של לקוח ל- JAXB API. כברירת מחדל, JAXB לא מעצב את מסמך ה- XML. זה חוסך מקום ומונע שכל חלל לבן יכול להתפרש בטעות כמשמעותי.

כדי ש- JAXB יפרמט את הפלט, פשוט הגדרנו את מרשלר. JAXB_FORMATTED_OUTPUT נכס ל נָכוֹן על מרשלר. שיטת המרשל משתמשת באובייקט ובקובץ פלט כדי לאחסן את ה- XML ​​שנוצר כפרמטרים.

כאשר אנו מריצים את הקוד לעיל, אנו עשויים לבדוק את התוצאה ב- book.xml כדי לוודא שאנחנו ממירים אובייקט Java לנתוני XML בהצלחה:

  ספר 1 2016-11-12T11: 25: 12.227 + 07: 00 

5. Un-marshalling - המרת XML לאובייקט Java

Un-marshalling מספק ליישום לקוח את היכולת להמיר נתוני XML לאובייקטים של Java שמקורם ב- JAXB.

בואו נשתמש ב- JAXB לא מתאר לבטל את המרשל שלנו book.xml בחזרה לאובייקט Java:

ספר ציבורי unmarshall () זורק JAXBException, IOException {JAXBContext context = JAXBContext.newInstance (Book.class); return (Book) context.createUnmarshaller () .unmarshal (FileReader חדש ("./ book.xml")); }

כאשר אנו מריצים את הקוד לעיל, אנו עשויים לבדוק את פלט המסוף כדי לוודא שהמרת נתוני XML בהצלחה לאובייקט Java:

ספר [id = 1, name = Book1, author = null, date = Sat Nov 12 11:38:18 ICT 2016]

6. סוגי נתונים מורכבים

כאשר אנו מטפלים בסוגי נתונים מורכבים שאולי אינם זמינים ישירות ב- JAXB, אנו עשויים לכתוב מתאם שיציין את JAXB כיצד לנהל סוג מסוים.

שימוש ב- JAXB מתאם Xml, אנו עשויים להגדיר קוד מותאם אישית להמרת מחלקה שאינה ניתנת ליישום למשהו ש- JAXB יכול להתמודד איתו. ה @XmlJavaTypeAdapter ההערה משתמשת במתאם המאריך את ה- מתאם Xml כיתה למריש בהתאמה אישית.

בואו ניצור מתאם לציון פורמט תאריך בעת התנהלות:

class class DateAdapter מרחיב את XmlAdapter {private static final ThreadLocal dateFormat = new ThreadLocal () {@Override מוגן DateFormat initialValue () {החזר SimpleDateFormat חדש ("yyyy-MM-dd HH: mm: ss"); }}; @Override public תאריך unmarshal (מחרוזת v) זורק חריג {return dateFormat.get (). Parse (v); } @Override ציבורי מחרוזת מחרוזת (תאריך v) זורק חריג {return dateFormat.get (). פורמט (v); }}

אנו משתמשים בפורמט תאריך “yyyy-MM-dd HH: mm: ss" להמיר תַאֲרִיך ל חוּט כאשר מארחים ו ThreadLocal להפוך את שלנו פורמט תאריך חוט בטוח.

בואו להחיל את תאריך מתאם שלנו סֵפֶר:

@XmlRootElement (name = "book") @XmlType (propOrder = {"id", "name", "date"}) class class ספר {פרטי ארוך מזהה; שם מחרוזת פרטי; סופר מחרוזת פרטי; תאריך תאריך פרטי; @XmlAttribute ציבורי ריק setId (מזהה ארוך) {this.id = id; } @XmlTransient public void setAuthor (מחרוזת מחבר) {this.author = author; } @XmlElement (name = "title") set public name ריק (שם מחרוזת) {this.name = שם; } @ XmlJavaTypeAdapter (DateAdapter.class) ריק ריק setDate (תאריך תאריך) {this.date = תאריך; }}

כאשר אנו מריצים את הקוד לעיל, אנו עשויים לבדוק את התוצאה ב- book.xml כדי לוודא שהמרתנו בהצלחה את אובייקט Java שלנו ל- XML ​​באמצעות פורמט התאריך החדש "yyyy-MM-dd HH: mm: ss“:

  ספר 1 גמר 2016-11-10 23: 44: 18 

7. תוסף JAXB-2 Maven

תוסף זה משתמש ב- Java API ל- XML ​​Binding (JAXB), גרסה 2+, ליצירת שיעורי Java מתוכניות XML (וקישור אופציונלי של קבצים) או ליצירת סכימת XML ממעמד Java המאושר.

שים לב שישנן שתי גישות בסיסיות לבניית שירותי אינטרנט, חוזה אחרון ו חוזה ראשון. לפרטים נוספים על גישות אלה, כדאי לבדוק את הקישור הבא.

7.1. יצירת מחלקת Java מ- XSD

התוסף JAXB-2 Maven משתמש בכלי המסופק על ידי JDK XJC, כלי מהדר מחייב JAXB המחולל שיעורי Java מ- XSD (הגדרת סכמת XML).

בואו ניצור פשוט user.xsd הקובץ והשתמש בתוסף JAXB-2 Maven כדי ליצור שיעורי Java מסכמת XSD זו:

בואו להגדיר את התוסף JAXB-2 Maven:

 org.codehaus.mojo jaxb2-maven-plugin 2.3 xjc xjc src / main / resources / global.xjb src / main / resources / user.xsd $ {basedir} / src / main / java false 

כברירת מחדל, תוסף זה מאתר קבצי XSD ב src / main / xsd. אנו עשויים להגדיר את בדיקת ה- XSD על ידי שינוי קטע התצורה של תוסף זה ב- pom.xml בהתאם לכך.

כברירת מחדל, שיעורי Java אלה נוצרים ב- יעד / משאבים שנוצרו / jaxb תיקיה. אנו עשויים לשנות את ספריית הפלט על ידי הוספת ספריית פלט אלמנט לתצורת התוסף. אנו עשויים להוסיף גם א clearOutputDir אלמנט עם ערך שקר כדי למנוע את מחיקת הקבצים בספרייה זו.

אנו עשויים גם להגדיר כריכת JAXB גלובלית העוקפת את כללי המחייב המוגדרים כברירת מחדל:

ה global.xjb לעיל עוקף את תאריך שעה הקלד ל java.util.Calendar סוּג.

כשאנחנו בונים את הפרויקט, הוא יוצר קבצי מחלקה ב- src / main / java תיקייה וחבילה com.baeldung.jaxb.gen.

7.2. יצירת סכמת XSD מג'אווה

אותו תוסף משתמש בכלי המסופק על ידי JDK סכמגן. זהו כלי מהדר JAXB Binding שיכול ליצור סכימת XSD משיעורי Java. על מנת ש- Java Class יהיה זכאי למועמד לסכמת XSD, יש לציין את הכיתה עם @XmlType ביאור.

אנו משתמשים שוב בקבצי מחלקת Java מהדוגמה הקודמת. בואו להגדיר את התוסף:

 org.codehaus.mojo jaxb2-maven-plugin 2.3 schemagen schemagen src / main / java / com / baeldung / jaxb / gen src / main / resources false / jaxb / gen user-gen.xsd 

כברירת מחדל, JAXB סורק את כל התיקיות שמתחת src / main / java רקורסיבית לשיעורי JAXB המבוארים. אנו עשויים לציין אחר מָקוֹר תיקייה לשיעורי ה- JAXB המאושרים על ידי הוספת a מָקוֹר אלמנט לתצורת התוסף.

אנו עשויים לרשום גם א transformSchemas, מעבד פוסט האחראי על מתן שמות לסכמת XSD. זה עובד על ידי התאמת ה- מרחב שמות עם מרחב השמות של ה- @XmlType של מחלקת Java שלך.

כשאנחנו בונים את הפרויקט הוא מייצר user-gen.xsd קובץ ב- src / main / resources מַדרִיך.

8. סיכום

במאמר זה סקרנו מושגי היכרות ב- JAXB. לפרטים, אנו יכולים להציץ בדף הבית של JAXB.

אנו יכולים למצוא את קוד המקור של מאמר זה ב- GitHub.