Geschrieben im vorherigen Artikel: Der Artikel wird für eine lange Zeit hauptsächlich die tatsächlichen Probleme in einigen Projekten und entsprechenden Lösungen aufzeichnen. Bei der Analyse des entsprechenden Codes wird das Problem direkt angezeigt und keine irrelevanten Prozesscodes veröffentlicht. Interessierte Leser können sie selbst verfolgen. Gleichzeitig hoffe ich, dass jeder seine Erfahrungen im Kommentarbereich teilen kann, damit jeder gemeinsam Fortschritte machen kann!
Umgebung oder Version: Frühling 3.2.3
Phänomen: Der eigene MessageSource von Spring wird verwendet, um das internationale Texten zu verarbeiten. Einige Platzhalter im Texten im US -Bundesstaat wurden nicht ersetzt, was im CN -Zustand normal ist. Das Copywriting ist wie folgt:
tms.pallet.Order.box.qty = Die Gesamtkästchen Gesamtpalettenkästchen {0} stimmt nicht mit der empfangenen Kästchen -Menge {1} überein. Bitte überprüfen Sie!
tms.pallet.order.box.qty = Gesamtzahl der Kästchen für das Boarding {0}, was nicht mit der Gesamtzahl der Kästchen für Bestellbeleg {1} widerspricht. Bitte überprüfen!
Intuition: Ist das englische Texter zu lang? Die Feder hat die Länge bei der Verarbeitung eingeschränkt. Nachdem der Frühling sorgfältig darüber nachgedacht hat, sollte er nicht so erbärmlich sein.
Fehlerbehebung: Breakpoints verfolgen Spring -Quellcode (Eintrag: MessageSource getMessage -Methode) und entdeckte schließlich eine Verarbeitungsmethode wie diese in MessageFormat:
// Indizes für Segmente Private statische endgültige int Seg_raw = 0; private statische endgültige int seg_index = 1; private statische endgültige int seg_type = 2; private statische endgültige int seg_modifier = 3; // Modifikator oder Subformat/*** Legt das von diesem Nachrichtenformat verwendete Muster fest. * Die Methode analysiert das Muster und erstellt eine Liste von Subformaten * für die darin enthaltenen Formatelemente. * Muster und ihre Interpretation sind im * <a href = "#musters" rel = "external nofollow"> Klasse Beschreibung </a> angegeben. * * @param Muster Das Muster für dieses Nachrichtenformat * @Exception illegalArgumentException Wenn das Muster ungültig ist // hier nur Segmente [SEG_RAW] zuweisen. Der Rest wird // auf Demand zugewiesen. Segmente [SEG_RAW] = new StringBuilder (); int part = seg_raw; int formatnumber = 0; boolean Inquote = false; int bracestack = 0; MaxOffset = -1; für (int i = 0; i <muster.Length (); ++ i) {char ch = muster.charat (i); if (part == SEG_RAW) {if (ch == '/' ') {if (i + 1 <muster.Length () && muster.charat (i + 1) =='/'') {Segmente [part] .Append (ch); // Doppel behandeln ++ i; } else {Inquote =! Inquote; }} else if (ch == '{' &&! Inquote) {part = seg_index; if (Segmente [SEG_INDEX] == null) {Segmente [SEG_Index] = new StringBuilder (); }} else {Segmente [Teil] .Append (ch); }} else {if (inquote) {// Kopieren Sie einfach Zitate in Partssegmenten [Teil] .Append (ch); if (ch == '/' ') {Inquote = false; }} else {switch (ch) {case ',': if (part <seg_modifier) {if (Segmente [++ Teil] == null) {Segmente [part] = new StringBuilder (); }} else {Segmente [Teil] .Append (ch); } brechen; case '{': ++ bracestack; Segmente [Teil] .Append (CH); brechen; Fall '}': if (bracestack == 0) {part = seg_raw; makeFormat (i, formatnumber, segmente); formatnumber ++; // andere Segmente wegwerfen [SEG_INDEX] = NULL; Segmente [SEG_TYPE] = NULL; Segmente [Seg_Modifier] = NULL; } else {--bracestack; Segmente [Teil] .Append (CH); } brechen; Fall '': // Überspringen Sie alle führenden Space -Zeichen für SEG_TYPE. if (Teil! } brechen; Fall '/' ': Inquote = true; // Fallen Sie durch, also behalten wir Zitate in anderen Teilen Standard: Segmente [Teil] .Append (ch); brechen; }}}}} if (bracestack == 0 && part! = 0) {maxoffset = -1; Neue IllegalArgumentException werfen ("unerreichte Zahnspangen im Muster."); } this.pattern = Segmente [0] .ToString (); }Der obige Code ist etwas verwirrend und etwas seltsam. Wir schauen uns hauptsächlich den ersten logischen Zweig an: durchqueren die Zeichen in jeder ausstehenden internationalen Kopiervorlagezeichenfolge. Wenn der Charakter "" "ist, bestimmen Sie, ob der nächste Charakter auch" "" ist. Wenn ja, spleifen Sie "'' in den verarbeiteten StringBuilder. Wenn nicht, ist Inquote wahr. Wenn das Zeichen nicht '{' und infrages falsch ist, dann setze das Teil auf 0 zurück und wenn Segmente [SEG_INDEX] = NULL, das StringBuilder -Objekt neu erstellen, andernfalls weiter Spleißen.
Ursache Analyse:
Lösung:
Aus dem Quellcode gibt es nur eine Lösung. Einzelne Zitate zwischen {} müssen paarweise erscheinen. Unsere Umgangsweise besteht darin, die Kopie an zu ändern:
tms.pallet.order.box.qty = Die Gesamtkästchen Gesamtpalettenkästchen {0} stimmt nicht mit der empfangenen Kästchen -Menge {1} überein, bitte überprüfen Sie es!
Das direkte Ändern des Texters ist keine gute Lösung. Es ist am besten, eine Methode neu zu schreiben, bevor Spring die Methode für applyPattern aufruft, um einzelne Zitate durch Doppelzitate zu ersetzen. Leider sind die entsprechenden internationalen Verarbeitungsmethoden im Frühjahr 3.2.3 den ganzen Weg privat und bieten Ihnen nicht die Möglichkeit, neu zu schreiben.
Nachdem Sie relevante Informationen konsultiert haben, können Sie feststellen, dass Sie im Frühjahr 4.3.2 die GetStringornull -Methode in der RessourcenbundLemessagesource -Klasse umschreiben können, um dies zu erreichen.
Langfristige Lösung: Aktualisieren Sie die Frühlingsversion im Projekt und verwenden Sie mehr neue Funktionen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.