เขียนในบทความก่อนหน้า: เป็นเวลานานบทความส่วนใหญ่จะบันทึกปัญหาที่เกิดขึ้นจริงที่พบในบางโครงการและโซลูชันที่เกี่ยวข้อง เมื่อวิเคราะห์รหัสที่เกี่ยวข้องจะชี้ให้เห็นปัญหาโดยตรงและจะไม่โพสต์รหัสกระบวนการที่ไม่เกี่ยวข้อง ผู้อ่านที่สนใจสามารถติดตามพวกเขาเอง ในเวลาเดียวกันฉันหวังว่าทุกคนสามารถแบ่งปันประสบการณ์ของพวกเขาในพื้นที่แสดงความคิดเห็นเพื่อให้ทุกคนสามารถก้าวหน้าด้วยกัน!
สภาพแวดล้อมหรือเวอร์ชัน: ฤดูใบไม้ผลิ 3.2.3
ปรากฏการณ์: MessagesOrce ของฤดูใบไม้ผลิใช้เพื่อประมวลผลคำโฆษณาระหว่างประเทศ สถานที่บางตัวในการเขียนคำโฆษณาในรัฐสหรัฐอเมริกายังไม่ได้ถูกแทนที่ซึ่งเป็นเรื่องปกติในสถานะ CN การเขียนคำโฆษณามีดังนี้:
tms.pallet.order.box.qty = ปริมาณกล่องพาเลททั้งหมดปริมาณ {0} ไม่ตรงกับปริมาณกล่องที่ได้รับ {1} โปรดตรวจสอบอีกครั้ง!
tms.pallet.order.box.qty = จำนวนกล่องทั้งหมดสำหรับการขึ้นเครื่อง {0} ซึ่งไม่สอดคล้องกับจำนวนกล่องทั้งหมดสำหรับใบเสร็จรับเงิน {1} โปรดตรวจสอบ!
สัญชาตญาณ: การเขียนคำโฆษณาภาษาอังกฤษนานเกินไปหรือไม่? ฤดูใบไม้ผลิได้จำกัดความยาวเมื่อประมวลผล หลังจากคิดถึงมันอย่างระมัดระวังฤดูใบไม้ผลิไม่ควรน่าสงสาร
การแก้ไขปัญหา: เบรกพอยต์ติดตามซอร์สโค้ดสปริง (รายการ: MessagesOrce GetMessage Method) และในที่สุดก็ค้นพบวิธีการประมวลผลเช่นนี้ใน MessageFormat:
// ดัชนีสำหรับเซ็กเมนต์ส่วนตัวคงที่ int สุดท้าย seg_raw = 0; int คงสุดท้ายส่วนตัว seg_index = 1; int คงสุดท้ายส่วนตัว seg_type = 2; INT สุดท้ายคงที่ส่วนตัว seg_modifier = 3; // modifier หรือ subformat/*** ตั้งค่ารูปแบบที่ใช้โดยรูปแบบข้อความนี้ * วิธีการวิเคราะห์รูปแบบและสร้างรายการของ subformats * สำหรับองค์ประกอบรูปแบบที่มีอยู่ในนั้น * รูปแบบและการตีความของพวกเขาถูกระบุไว้ใน * <a href = "#รูปแบบ" rel = "external nofollow"> คำอธิบายคลาส </a> * * @param รูปแบบรูปแบบสำหรับรูปแบบข้อความนี้ * @exception unlegalargumentException หากรูปแบบไม่ถูกต้อง */ @suppresswarnings ("Fallthrough") // Fallthrough ในสวิตช์คาดว่าจะระงับมันเป็นโมฆะสาธารณะ // จัดสรรเฉพาะส่วน [seg_raw] ที่นี่ ส่วนที่เหลือคือ // จัดสรรตามความต้องการ เซ็กเมนต์ [seg_raw] = new StringBuilder (); int part = seg_raw; int formatNumber = 0; บูลีน Inquote = FALSE; int bracestack = 0; maxoffset = -1; สำหรับ (int i = 0; i <pattern.length (); ++ i) {char ch = pattern.charat (i); if (part == seg_raw) {ถ้า (ch == '/' ') {ถ้า (i + 1 <pattern.length () && pattern.charat (i + 1) =='/'') {เซ็กเมนต์ [ส่วน] .append (ch); // จัดการ doubles ++ i; } else {Inquote =! Inquote; }} อื่นถ้า (ch == '{' &&! inquote) {part = seg_index; if (เซ็กเมนต์ [seg_index] == null) {เซ็กเมนต์ [seg_index] = new StringBuilder (); }} else {เซ็กเมนต์ [ส่วน] .append (ch); }} else {ถ้า (สอบถาม) {// เพียงแค่คัดลอกคำพูดในส่วนของชิ้นส่วน [ส่วน] .append (ch); if (ch == '/' ') {inquote = false; }} else {switch (ch) {case ',': if (ส่วน <seg_modifier) {ถ้า (ส่วน [++ ส่วน] == null) {เซ็กเมนต์ [ส่วน] = new StringBuilder (); }} else {เซ็กเมนต์ [ส่วน] .append (ch); } หยุดพัก; กรณี '{': ++ bracestack; ส่วน [ส่วน] .append (CH); หยุดพัก; กรณี '}': ถ้า (bracestack == 0) {part = seg_raw; MakeFormat (i, formatNumber, เซ็กเมนต์); FormatNumber ++; // ทิ้งเซ็กเมนต์ส่วนอื่น ๆ [SEG_INDEX] = NULL; เซ็กเมนต์ [seg_type] = null; เซ็กเมนต์ [seg_modifier] = null; } else { -BRACESTACK; ส่วน [ส่วน] .append (CH); } หยุดพัก; กรณี '': // ข้ามตัวอักษรอวกาศชั้นนำสำหรับ SEG_TYPE if (part! = seg_type || เซ็กเมนต์ [seg_type] .length ()> 0) {ส่วน [ส่วน] .append (ch); } หยุดพัก; กรณี '/' ': inquote = true; // ล้มลงดังนั้นเราจึงเก็บราคาไว้ในส่วนอื่น ๆ เริ่มต้น: เซ็กเมนต์ [ส่วน] .append (CH); หยุดพัก; }}}}} ถ้า (bracestack == 0 && part! = 0) {maxoffset = -1; โยน unlegalargumentException ใหม่ ("วงเล็บปีกกาที่ไม่มีใครเทียบในรูปแบบ"); } this.pattern = เซ็กเมนต์ [0] .tostring (); -รหัสข้างต้นค่อนข้างสับสนและแปลกเล็กน้อย เราดูที่สาขาตรรกะแรก: สำรวจอักขระในแต่ละสตริงเทมเพลตสำเนาระหว่างประเทศที่รอดำเนินการ เมื่อตัวละครคือ "'" ให้ตรวจสอบว่าตัวละครต่อไปนั้นเป็น "" "หรือไม่ ถ้าเป็นเช่นนั้นประกบกัน "" ลงในสตริงที่ประมวลผล ถ้าไม่สอบถามเป็นจริง หากอักขระไม่ได้ '{' และการสอบถามเป็นเท็จให้รีเซ็ตส่วนเป็น 0 และหากเซ็กเมนต์ [seg_index] = null ให้สร้างวัตถุ StringBuilder ใหม่
การวิเคราะห์สาเหตุ:
สารละลาย:
จากซอร์สโค้ดมีเพียงวิธีเดียวเท่านั้น คำพูดเดียวระหว่าง {} ต้องปรากฏเป็นคู่ วิธีการจัดการของเราคือการปรับเปลี่ยนสำเนาเป็น:
tms.pallet.order.box.qty = ปริมาณกล่องพาเลททั้งหมดปริมาณ {0} ไม่ตรงกับปริมาณกล่องที่ได้รับ {1} โปรดตรวจสอบอีกครั้ง!
การแก้ไขคำโฆษณาโดยตรงไม่ใช่ทางออกที่ดี เป็นการดีที่สุดที่จะสามารถเขียนวิธีการใหม่ก่อนที่จะเรียกใช้เมธอด ApplyPattern เพื่อแทนที่คำพูดเดียวด้วยคำพูดสองเท่า น่าเสียดายที่วิธีการประมวลผลระหว่างประเทศที่สอดคล้องกันในฤดูใบไม้ผลิ 3.2.3 เป็นส่วนตัวตลอดทางและพวกเขาไม่ได้ให้โอกาสคุณเขียนใหม่
หลังจากให้คำปรึกษาข้อมูลที่เกี่ยวข้องคุณจะพบได้ในเวอร์ชันฤดูใบไม้ผลิ 4.3.2 คุณสามารถเขียนวิธี GetStringOrnull ในคลาส ResourceBundleMessagesource เพื่อให้ได้มา
โซลูชันระยะยาว: อัพเกรดเวอร์ชันฤดูใบไม้ผลิในโครงการและใช้คุณสมบัติใหม่เพิ่มเติม
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น