前の記事に書かれた:長い間、この記事は主に、一部のプロジェクトで発生した実際の問題と対応するソリューションを記録します。対応するコードを分析する場合、問題を直接指摘し、無関係なプロセスコードを投稿しません。興味のある読者は自分で追跡できます。同時に、誰もがコメント領域で経験を共有して、誰もが一緒に進歩できるようにすることを願っています!
環境またはバージョン:春3.2.3
Phenomenon:Spring独自のMessagesourceは、国際的なコピーライティングを処理するために使用されます。米国州のコピーライティングの一部のプレースホルダーは置き換えられていません。これはCN州では正常です。コピーライティングは次のとおりです。
tms.pallet.order.box.qty =合計パレット化されたボックス数量{0}は、受信したボックス数量{1}と一致しない、再確認してください!
tms.pallet.order.box.qty =搭乗{0}のボックスの総数。お会計お願いします!
直感:英語のコピーライティングは長すぎますか?春は、処理時に長さを制限しています。それについて慎重に考えた後、春はそれほど哀れではないはずです。
トラブルシューティング:BreakPoints Track Spring Source Code(Entry:MessagesSource GetMessage Method)を追跡し、最終的にMessageFormatでこのような処理方法を発見しました。
//セグメントのインデックスプライベート静的最終int seg_raw = 0;プライベート静的最終int seg_index = 1;プライベート静的最終int seg_type = 2; Private static final int seg_modifier = 3; // modifierまたはsubformat/***このメッセージ形式で使用されるパターンを設定します。 *このメソッドは、パターンを解析し、その中に含まれるフォーマット要素のサブフォーマットのリストを作成します。 *パターンとその解釈は、 * <a href = "#patterns" rel = "external nofollow">クラスの説明</a>で指定されています。 * * @paramパターンこのメッセージフォーマットのパターン * @exceptionパターンが無効である場合 */ @suppresswarnings( "fallthrough")//スイッチのフォールスルーが予想されます。 //ここではセグメントのみ[SEG_RAW]を割り当てます。残りは//オンデマンドで割り当てられます。セグメント[seg_raw] = new StringBuilder(); int part = seg_raw; int formatnumber = 0; boolean quate = false; int bracestack = 0; maxoffset = -1; for(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)=='/''){segments [part] .append(ch); // doubles ++ iを処理します。 } else {quate =!quate; quate; }} else if(ch == '{' &&!quate){part = seg_index; if(segments [seg_index] == null){segments [seg_index] = new StringBuilder(); }} else {segments [part] .append(ch); }} else {if(quate){//パーツセグメント[パート] .append(ch); if(ch == '/' '){quate = false; }} else {switch(ch){case '、':if(part <seg_modifier){if(segments [++ part] == null){segments [part] = new StringBuilder(); }} else {segments [part] .append(ch); } 壊す; case '{':++ bracestack;セグメント[part] .append(ch);壊す; case '}':if(bracestack == 0){part = seg_raw; makeformat(i、formatnumber、segments); formatnumber ++; //他のセグメントセグメント[seg_index] = null;セグメント[seg_type] = null;セグメント[seg_modifier] = null; } else {-braceStack;セグメント[part] .append(ch); } 壊す;ケース '':// seg_typeの主要なスペースcharをスキップします。 if(part!= seg_type || segments [seg_type] .length()> 0){segments [part] .append(ch); } 壊す; case '/' ':quate = true; //落ちるので、他の部分に引用符を掲載しますデフォルト:セグメント[part] .append(ch);壊す; }}}}} if(braceStack == 0 && part!= 0){maxoffset = -1;新しいIllegalargumentException( "パターンの比類のないブレース。"); } this.pattern = segments [0] .toString(); }上記のコードは少し混乱し、少し奇妙です。主に最初の論理ブランチを見ています。各保留中の国際コピーテンプレート文字列の文字を横断します。キャラクターが「 '」の場合、次のキャラクターも「'」であるかどうかを判断します。もしそうなら、処理されたstringbuilderにスプライス "'"。そうでない場合、質問は真実です。文字が「{」と質問が偽でない場合、部品を0にリセットし、セグメント[seg_index] = nullの場合、stringbuilderオブジェクトを再現し、それ以外の場合はスプライシングを続けます。
原因分析:
解決:
ソースコードから、ソリューションは1つだけです。 {}間の単一の引用は、ペアで表示する必要があります。私たちの取り扱い方法は、コピーを以下に変更することです。
tms.pallet.order.box.qty =合計パレット化されたボックス数量{0}は、受信したボックス数量{1}と一致しません、再確認してください!
コピーライティングを直接変更することは良い解決策ではありません。 SpringがApplyPatternメソッドを呼び出して、単一の引用符を二重引用符で置き換える前に、メソッドを書き換えることが最善です。残念ながら、春3.2.3の対応する国際処理方法はずっとプライベートであり、書き直す機会を与えません。
関連情報に相談した後、Spring 4.3.2バージョンでは、ResourceBundleMessagesOurceクラスのGetStringornullメソッドを書き換えてそれを達成できることがわかります。
長期ソリューション:プロジェクトの春版をアップグレードし、より多くの新機能を使用します。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。