LocalDate ، LocalTime ، LocalDateTime هي واجهات برمجة تطبيقات الوقت والتاريخ التي توفرها Java 8 ، والتي تستخدم بشكل أساسي لتحسين عمليات المعالجة للوقت والتواريخ في Java 8 من قبل. ومع ذلك ، عندما نستخدم SPRING BOOT أو Spring Cloud Feign ، غالبًا ما نجد أن المشكلات المختلفة ستحدث عند استخدام معلمات الطلب أو نتائج العودة. في هذه المقالة ، سنتحدث عن المشكلات التي تنشأ في هذا الموقف وكيفية حلها.
ظاهرة المشكلة
دعونا نلقي نظرة على الأعراض أولاً. على سبيل المثال ، المثال التالي:
springbootapplicationpublicpublic application {public static void main (string [] args) {springapplication.run (application.class ، args) ؛ } RestController Class HelloconTroller {postMapping ("/user") المستخدم العام userdto ( @requestbody userdto userdto) يلقي الاستثناء {return userdto ؛ }} data @noargsconstructor allargSconstructor static class userdto {private string username ؛ عيد ميلاد محلي خاص ؛ }}يقوم الرمز أعلاه بإنشاء تطبيق ويب SPRING SPRING SPRING ، والذي يوفر واجهة لإرسال معلومات المستخدم ، والتي تحتوي على بيانات من نوع LocalDate. في هذا الوقت ، إذا استخدمنا Feign لاستدعاء هذه الواجهة ، فسوف نحصل على الخطأ التالي:
2018-03-13 09: 22: 58،445 تحذير [http-nio-9988-exec-3] org.springframework.web.servlet.mvc.support.defaulthandlerexceptionResolver- org.springframework.http.converter.httpmessagenoTreadableException: json parse خطأ: لا يمكن بناء مثيل java.time.localdate: لا يوجد منشئ مناسب ، لا يمكن أن يهدأ من قيمة الكائن (مفقود بنية تفصيلية أو منشئ ، أو ربما تحتاج إلى إضافة/معلومات عن النوع؟) ؛ الاستثناء المتداخل هو com.fasterxml.jackson.databind.jsonmappexception: لا يمكن بناء مثيل java.time.localdate: لم يتم العثور على مُنشئ مناسب ، أو لا يمكن أن يمرر من قيمة الكائن (مفقود مُنشئ أو منشئ jostraptream@6065 ؛ السطر: 1 ، العمود: 63] (من خلال السلسلة المرجعية: java.util.arraylist [0]-> com.didispace.userdto ["عيد الميلاد"])
التحليل والحل
بالنسبة لرسالة الخطأ المذكورة أعلاه JSON parse error: Can not construct instance of java.time.LocalDate: no suitable constructor found, can not deserialize from Object value ، يجب أن تكون أحذية الأطفال المألوفة لـ Spring MVC قادرة على تحديد موقع الخطأ على الفور وأن يكون مرتبطًا بتسهيل المحلية. ومع ذلك ، لا يزال هناك العديد من القراء الذين سيتم الخلط بينهم من خلال رسالة الخطأ هذه java.util.ArrayList[0]->com.didispace.UserDto["birthday"] . UserDto["birthday"] قمنا بتسميناه وقدمنا هو كائن محلي. ما علاقةه بكائن قائمة ArrayList؟
قد نرسل طلبًا يدويًا من خلال ساعي البريد أو المعلومات الأخرى لمعرفة ما يعيده الخادم؟ على سبيل المثال ، يمكنك تقديم طلب وفقًا للصورة التالية:
من الشكل أعلاه ، يمكننا أن نفهم الارتباك الذي ذكرته أعلاه. في الواقع ، بشكل افتراضي ، يقوم Spring MVC بتسلسل LocalDate إلى نوع صفيف ، وعندما يتم استدعاء Feign ، فإنه لا يزال يعالجه وفقًا لـ ArrayList ، لذلك من الطبيعي أن لا يمكن إلغاؤه لكائن محلي.
حل
من أجل حل المشكلة أعلاه ، يكون الأمر بسيطًا للغاية ، لأن جاكسون يوفر أيضًا مجموعة كاملة من حلول التسلسل لهذا الغرض. نحتاج فقط إلى تقديم التبعية Jackson-Datatype-JSR310 في pom.xml ، على النحو التالي:
<Rependency> <roupend> com.fasterxml.jackson.datatype </rougiD> <StifactId> Jackson-Datatype-JSR310 </stifactid> </reperence>
ملاحظة: عندما يتم تعيين الوالد من SPRING BOOT ، ليست هناك حاجة لتحديد إصدار معين ، ولا ينصح بتحديد إصدار محدد.
تغليف تنفيذ تسلسل API للوقت في Java 8 في هذه الوحدة ، وتنفيذها المحدد في هذه الفئة: com.fasterxml.jackson.datatype.jsr310.javatimemodule (ملاحظة: بعض الإصدارات السابقة من هذا الفصل " التبعية ، نحتاج فقط إلى إضافة وحدة التسلسل هذه إلى الفئة الرئيسية للتطبيق أعلاه ، وفي الوقت نفسه ، قم بتمكين تنسيق ISO 8601 القياسي:
beanpublic ObjectMapper serializingObjectMapper () {ObjectMapper ObjectMapper = new ObjectMapper () ؛ ObjectMapper.disable (SerializationFeature.write_dates_as_timestamps) ؛ ObjectMapper.registerModule (new javatimemodule ()) ؛ إرجاع ObjectMapper ؛}في هذا الوقت ، عندما نصل إلى الواجهة الآن ، لم يعد نوع الصفيف ، ولن تحدث الأخطاء المذكورة أعلاه عندما نسمي عميل Feign.
مثال رمز
للحصول على أمثلة ذات صلة في هذه المقالة ، يمكنك عرض دليل الفصل 3-1-7 في المستودع التالي:
Github: https://github.com/dyc87112/springboot-learning
gite: https://gitee.com/diidispace/springboot-learning
لخص
ما سبق هو مشكلة التسلسل المتمثلة في استخدام Java 8 Time and Date API (LocalDate ، وما إلى ذلك) في الحذاء الربيعي والتظاهر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!