مكتوبة في المقالة السابقة: لفترة طويلة ، ستسجل المقال بشكل أساسي المشكلات الفعلية التي واجهتها في بعض المشاريع والحلول المقابلة. عند تحليل الكود المقابل ، سيشير مباشرة إلى المشكلة ولن تنشر رموز عملية غير ذات صلة. يمكن للقراء المهتمين تتبعهم بأنفسهم. في الوقت نفسه ، آمل أن يتمكن الجميع من مشاركة تجاربهم في مجال التعليق حتى يتمكن الجميع من إحراز تقدم معًا!
البيئة أو النسخة: الربيع 3.2.3
الظاهرة: يتم استخدام رسائل الربيع الخاصة بمعالجة كتابة الإعلانات الدولية. لم يتم استبدال بعض العناصر النائبة في كتابة النصوص في الدولة الأمريكية ، وهو أمر طبيعي في حالة CN. كتابة الإعلانات كما يلي:
tms.pallet.order.box.qty = لا يتطابق الكمية الإجمالية للبليتات {0} مع كمية المربعات المستلمة {1} ، يرجى التحقق المزدوج!
tms.pallet.order.box.qty = إجمالي عدد الصناديق للصعود {0} ، والذي لا يتوافق مع العدد الإجمالي للمربعات لإيصال الطلب {1}. تحقق من فضلك!
الحدس: هل كتابة الإعلانات الإنجليزية طويلة جدًا؟ لقد تقيد الربيع الطول عند معالجته. بعد التفكير في الأمر بعناية ، يجب ألا يكون الربيع يرثى له.
استكشاف الأخطاء وإصلاحها: نقاط التوقف تتبع رمز مصدر الربيع (الإدخال: طريقة getMessage Messagesource) ، واكتشف أخيرًا طريقة معالجة مثل هذه في MessageFormat:
// مؤشرات للقطاعات الخاصة الثابتة النهائية int seg_raw = 0 ؛ خاص ثابت نهائي int seg_index = 1 ؛ int static int seg_type = 2 ؛ int static int seg_modifier = 3 ؛ // modifier أو subformat/*** يعين النمط المستخدم بواسطة تنسيق الرسالة هذا. * الطريقة تخيل النمط وتنشئ قائمة بالرسوم الفرعية * لعناصر التنسيق الموجودة فيه. * يتم تحديد أنماط وتفسيرها في * <a href = "#patterns" rel = "severonal nofollow"> الوصف الفئة </a>. * * نمط param النمط لتنسيق الرسالة هذا * exception alfictalArgumentException إذا كان النمط غير صالح */ suppressWarnings ("Fallthrough") // من المتوقع أن يكون التراجع في التبديل ، وقمعه الفراغ العام تطبيق (نمط السلسلة) {StringBuilder [] SCREPS = New StringBuilder [4] ؛ // تخصيص الأجزاء فقط [seg_raw] هنا. الباقي يتم تخصيصه على الطلب. شرائح [seg_raw] = new StringBuilder () ؛ الجزء int = seg_raw ؛ int formatnumber = 0 ؛ التحقيق المنطقي = خطأ ؛ int bracestack = 0 ؛ maxoffset = -1 ؛ لـ (int i = 0 ؛ i <pattern.length () ؛ ++ i) {char ch = pattern.charat (i) ؛ if (part == seg_raw) {if (ch == '/' ') {if (i + 1 <pattern.length () && pattern.charat (i + 1) =='/'') {part] .append (ch) ؛ // التعامل مع الزوجي ++ i ؛ } آخر {requote =! requote ؛ }} آخر إذا (ch == '{' &&! requote) {part = seg_index ؛ if (Secments [seg_index] == null) {segments [seg_index] = new StringBuilder () ؛ }} else {screpments [part] .Append (ch) ؛ }} else {if (requote) {// Just Copy Quotes in Parts Screpments [part] .Append (ch) ؛ if (ch == '/' ') {requote = false ؛ }} else {switch (ch) {case '،': if (part <seg_modifier) {if (secments [++ part] == null) {segments [part] = new StringBuilder () ؛ }} else {screpments [part] .Append (ch) ؛ } استراحة؛ حالة '{': ++ bracestack ؛ شرائح [جزء] .append (ch) ؛ استراحة؛ الحالة '}': if (bracestack == 0) {part = seg_raw ؛ Makeformat (i ، formatnumber ، sepments) ؛ formatnumber ++ ؛ // رمي مقاطع شرائح أخرى [seg_index] = null ؛ شرائح [seg_type] = null ؛ شرائح [seg_modifier] = null ؛ } آخر { -bracestack ؛ شرائح [جزء] .append (ch) ؛ } استراحة؛ الحالة '': // تخطي أي chars فضاء رائدة لـ seg_type. if (part! = seg_type || secments [seg_type] .length ()> 0) {secments [part] .Append (ch) ؛ } استراحة؛ القضية "/'': QuestOte = true ؛ // fall من خلال ، لذلك نحتفظ بعروض الأسعار في أجزاء أخرى افتراضي: الأجزاء [part] .Append (ch) ؛ استراحة؛ }}}}} if (bracestack == 0 && part! = 0) {maxoffset = -1 ؛ رمي جديد غير شرعي ("أقواس لا مثيل لها في النمط.") ؛ } this.pattern = screpments [0] .ToString () ؛ }الرمز أعلاه مربك بعض الشيء وغريبة بعض الشيء. ننظر بشكل أساسي إلى الفرع المنطقي الأول: اجتياز الأحرف في كل سلسلة من قالب النسخ الدولية المعلقة. عندما تكون الحرف "" "، حدد ما إذا كان الحرف التالي هو أيضًا" "". إذا كان الأمر كذلك ، فإن لصق "" "في StringBuilder المعالجة. إذا لم يكن كذلك ، فإن التحقيق صحيح. إذا لم يكن الحرف "{" والتحقيق غير صحيح ، فأعد ضبط الجزء إلى 0 ، وإذا كانت الأجزاء [seg_index] = null ، أعد إنشاء كائن stringBuilder ، وإلا تابع الربط.
تحليل السبب:
حل:
من رمز المصدر ، هناك حل واحد فقط. اقتباسات واحدة بين {} تحتاج إلى الظهور في أزواج. طريقة التعامل معنا هي تعديل النسخة إلى:
tms.pallet.order.box.qty = الكمية الكلية للبليتات {0} لا تتطابق مع كمية الصناديق المستلمة {1} ، يرجى التحقق المزدوج!
تعديل كتابة النصوص مباشرة ليس حلاً جيدًا. من الأفضل أن تكون قادرًا على إعادة كتابة طريقة قبل أن يستدعي الربيع طريقة ApplyPattern لاستبدال عروض الأسعار المفردة مع علامات اقتباس مزدوجة. لسوء الحظ ، فإن أساليب المعالجة الدولية المقابلة في ربيع 3.2.3 هي خاصة على طول الطريق ، ولا تمنحك الفرصة لإعادة الكتابة.
بعد استشارة المعلومات ذات الصلة ، يمكنك العثور على أنه في Spring 4.3.2 الإصدار ، يمكنك إعادة كتابة طريقة GetStringornull في فئة ResourceBundleMessagesource لتحقيق ذلك.
الحل طويل الأجل: قم بترقية إصدار الربيع في المشروع ، واستخدم المزيد من الميزات الجديدة.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.