Ditulis dalam artikel sebelumnya: Untuk waktu yang lama, artikel ini terutama akan mencatat masalah aktual yang dihadapi dalam beberapa proyek dan solusi yang sesuai. Saat menganalisis kode yang sesuai, itu akan secara langsung menunjukkan masalah dan tidak akan memposting kode proses yang tidak relevan. Pembaca yang tertarik dapat melacaknya sendiri. Pada saat yang sama, saya berharap semua orang dapat berbagi pengalaman mereka di area komentar sehingga semua orang dapat membuat kemajuan bersama!
Lingkungan atau Versi: Spring 3.2.3
Fenomena: Sumber pesan Spring sendiri digunakan untuk memproses copywriting internasional. Beberapa placeholder di copywriting di negara bagian AS belum diganti, yang normal di negara bagian CN. Copywriting adalah sebagai berikut:
tms.pallet.order.box.qty = Total kuantitas kotak palet {0} tidak cocok dengan kuantitas kotak yang diterima {1}, silakan periksa kembali!
tms.pallet.order.box.qty = Jumlah total kotak untuk naik {0}, yang tidak konsisten dengan jumlah total kotak untuk penerimaan pesanan {1}. Tolong periksa!
Intuisi: Apakah copywriting bahasa Inggris terlalu lama? Musim semi telah membatasi panjangnya saat memprosesnya. Setelah memikirkannya dengan cermat, musim semi tidak boleh begitu menyedihkan.
Pemecahan Masalah: Breakpoints Track Spring Source Code (Entri: Metode GetMessage), dan akhirnya menemukan metode pemrosesan seperti ini di MessageFormat:
// indeks untuk segmen private static final int seg_raw = 0; private static final int seg_index = 1; private static final int seg_type = 2; private static final int seg_modifier = 3; // pengubah atau subformat/*** Mengatur pola yang digunakan oleh format pesan ini. * Metode ini mem -parsing pola dan membuat daftar subformat * untuk elemen format yang terkandung di dalamnya. * Pola dan interpretasinya ditentukan dalam * <a href = "#pola" rel = "eksternal nofollow"> Deskripsi kelas </a>. * * @param Pola Pola untuk format pesan ini * @Exception IllegalArgumentException Jika polanya tidak valid */ @suppresswarnings ("Fallthrough") // Fallthrough in Switch diharapkan, tekan void publik ApplyPattern (pola string) {StringBuilder [] Segments = New StringBuilder [4]; // Alokasikan hanya segmen [SEG_RAW] di sini. Sisanya // dialokasikan sesuai permintaan. segmen [SEG_RAW] = StringBuilder baru (); int bagian = seg_raw; int formatNumber = 0; Boolean Informote = false; int bracestack = 0; MaxOffset = -1; untuk (int i = 0; i <pola.length (); ++ i) {char ch = pola.charat (i); if (bagian == SEG_RAW) {if (ch == '/' ') {if (i + 1 <pola.length () && pola.charat (i + 1) =='/'') {segmen [bagian] .Append (ch); // menangani ganda ++ i; } else {informote =! informote; }} lain jika (ch == '{' &&! if (segmen [seg_index] == null) {segmen [SEG_INDEX] = new StringBuilder (); }} else {segmen [bagian] .Append (ch); }} else {if (inquote) {// cukup salin kutipan di segmen bagian [bagian] .Append (ch); if (ch == '/' ') {inquote = false; }} else {switch (ch) {case ',': if (bagian <seg_modifier) {if (segmen [++ bagian] == null) {segmen [bagian] = stringBuilder baru (); }} else {segmen [bagian] .Append (ch); } merusak; case '{': ++ bracestack; segmen [bagian] .Perampai (CH); merusak; case '}': if (bracestack == 0) {bagian = seg_raw; makeFormat (i, formatNumber, segmen); formatNumber ++; // membuang segmen lain segmen [SEG_INDEX] = NULL; segmen [SEG_TYPE] = NULL; segmen [SEG_MODIFIER] = null; } else {--bracestack; segmen [bagian] .Perampai (CH); } merusak; case '': // Lewati setiap karakter ruang angkasa terkemuka untuk SEG_TYPE. if (bagian! = SEG_TYPE || Segmen [SEG_TYPE] .length ()> 0) {segmen [bagian] .Append (ch); } merusak; case '/' ': informote = true; // jatuh, jadi kami menyimpan kutipan di bagian lain default: segmen [bagian] .Perpend (ch); merusak; }}}}} if (bracestack == 0 && part! = 0) {maxoffset = -1; Lemparkan IllegalArgumentException baru ("Kawat gigi yang tidak tertandingi dalam pola."); } this.pattern = segmen [0] .toString (); }Kode di atas agak membingungkan dan sedikit aneh. Kami terutama melihat cabang logis pertama: melintasi karakter di setiap string template salin internasional yang tertunda. Ketika karakter adalah "'", tentukan apakah karakter berikutnya juga "'". Jika demikian, sambungan "'" ke dalam stringbuilder yang diproses. Jika tidak, Informote itu benar. Jika karakter tidak '{' dan inquote salah, maka setel ulang bagian ke 0, dan jika segmen [SEG_INDEX] = NULL, buat ulang objek StringBuilder, jika tidak lanjutkan splicing.
Penyebab Analisis:
Larutan:
Dari kode sumber, hanya ada satu solusi. Kutipan tunggal antara {} perlu muncul berpasangan. Cara penanganan kami adalah memodifikasi salinannya menjadi:
tms.pallet.order.box.qty = Total kuantitas kotak palet {0} tidak cocok dengan kuantitas kotak yang diterima {1}, silakan periksa kembali!
Memodifikasi copywriting secara langsung bukanlah solusi yang baik. Yang terbaik adalah dapat menulis ulang metode sebelum Spring memanggil metode ApplyPattern untuk mengganti satu kutipan dengan kutipan ganda. Sayangnya, metode pemrosesan internasional yang sesuai di Spring 3.2.3 adalah pribadi sepanjang jalan, dan mereka tidak memberi Anda kesempatan untuk menulis ulang.
Setelah berkonsultasi dengan informasi yang relevan, Anda dapat menemukan bahwa di Versi Musim Semi 4.3.2, Anda dapat menulis ulang metode Getstringornull di kelas ResourceBundLeMessageSource untuk mencapainya.
Solusi jangka panjang: Tingkatkan versi musim semi dalam proyek, dan gunakan lebih banyak fitur baru.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.