البرمجة

تسلسل LocalDate باستخدام JAXB في جافا

في هذا الشياع، نقوم ببناء سلسلة من الفئات المرتبطة التي نرغب في تحويلها إلى XML حتى نتمكن من حفظها في ملف وقراءتها لاحقًا. يتم استخدام تقنية JAXB لهذا الغرض، والتي تساعد في تحويل الكائنات إلى تنسيق XML والعكس.

الشيفرة المستخدمة كحالة اختبار تقوم بتحويل كائن من النوع WrapperTest الذي يحتوي على حقل startDate من نوع LocalDate. ومع ذلك، يبدو أن الناتج النهائي للـ XML لا يحتوي على قيمة للعنصر startDate.

السبب وراء ذلك يعود إلى أن JAXB لا يعرف كيفية تحويل LocalDate إلى XML بشكل افتراضي. تحتاج إلى إضافة تخصيص خاص ليفهم كيف يجب تحويل LocalDate إلى ومن XML. يمكن فعل ذلك من خلال تنفيذ XmlAdapter لنوع LocalDate.

لتحقيق ذلك، يمكنك اتباع الخطوات التالية:

  1. أنشئ فئة تنفيذ XmlAdapter لـ LocalDate:
java
import javax.xml.bind.annotation.adapters.XmlAdapter; import java.time.LocalDate; public class LocalDateAdapter extends XmlAdapter { @Override public LocalDate unmarshal(String v) throws Exception { return LocalDate.parse(v); } @Override public String marshal(LocalDate v) throws Exception { return v.toString(); } }
  1. قم بتحديث الفئة WrapperTest لتضمن استخدام LocalDateAdapter:
java
import javax.xml.bind

المزيد من المعلومات

بالتأكيد، دعنا نستعرض المزيد من المعلومات لتوضيح السياق والحلول الممكنة لمشكلتك.

في الشيفرة المقدمة، يظهر أن JAXB لا يتمكن من فهم كيفية تسلسل نوع LocalDate بشكل صحيح، وبالتالي يترك العنصر startDate فارغًا في الإخراج XML. هذا يرجع إلى أنه ليس هناك محول (Adapter) مخصص لتحويل LocalDate إلى نص والعكس.

لحل هذه المشكلة، يمكنك إنشاء فئة تنفيذ XmlAdapter تقوم بتحويل LocalDate إلى سلسلة نصية والعكس. في المثال أدناه، قمت بإنشاء فئة LocalDateAdapter:

java
import javax.xml.bind.annotation.adapters.XmlAdapter; import java.time.LocalDate; public class LocalDateAdapter extends XmlAdapter { @Override public LocalDate unmarshal(String v) throws Exception { return LocalDate.parse(v); } @Override public String marshal(LocalDate v) throws Exception { return v.toString(); } }

ثم يجب تعليق حقل startDate في الفئة WrapperTest باستخدام @XmlJavaTypeAdapter لتطبيق محول النوع المخصص:

java
import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import java.time.LocalDate; public class LocalDateExample { @XmlRootElement private static class WrapperTest { @XmlJavaTypeAdapter(LocalDateAdapter.class) public LocalDate startDate; } public static void main(String[] args) throws JAXBException { WrapperTest wt = new WrapperTest(); LocalDate ld = LocalDate.of(2016, 3, 1); wt.startDate = ld; marshall(wt); } public static void marshall(Object jaxbObject) throws JAXBException { JAXBContext context = JAXBContext.newInstance(jaxbObject.getClass()); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(jaxbObject, System.out); } }

هذا التعديل يجلب الآن نتائج الإخراج المتوقعة، حيث يتم تحويل LocalDate إلى سلسلة نصية باستخدام المحول ويظهر الناتج بشكل صحيح في العنصر startDate في الإخراج XML.

تأكد من تجربة هذا التعديل في بيئتك، ويمكنك توسيع المفهوم عند الحاجة أو طرح أي استفسارات إضافية تتعلق بمشكلتك.

زر الذهاب إلى الأعلى