Écrit dans l'article précédent: Pendant longtemps, l'article enregistrera principalement les problèmes réels rencontrés dans certains projets et les solutions correspondantes. Lors de l'analyse du code correspondant, il indiquera directement le problème et ne publiera pas de codes de processus non pertinents. Les lecteurs intéressés peuvent les suivre eux-mêmes. En même temps, j'espère que tout le monde pourra partager ses expériences dans la zone de commentaires afin que tout le monde puisse progresser ensemble!
Environnement ou version: printemps 3.2.3
Phénomène: le propre message de Spring est utilisé pour traiter la rédaction internationale. Certains espaces réservés de la rédaction de l'État américain n'ont pas été remplacés, ce qui est normal à l'état CN. La rédaction est la suivante:
tms.pallet.order.box.qty = La quantité totale des boîtes palettisées {0} ne correspond pas à la quantité de boîtes reçue {1}, veuillez vérifier!
tms.pallet.order.box.qty = nombre total de boîtes pour l'embarquement {0}, qui est incompatible avec le nombre total de boîtes pour la réception de commande {1}. Vérifiez, s'il vous plaît!
Intuition: La rédaction anglaise est-elle trop longue? Le printemps a limité la longueur lors du traitement. Après y avoir pensé avec soin, le printemps ne devrait pas être aussi pitoyable.
Dépannage: BreakPoints Track Spring Source Code (Entrée: MessageSource GetMessage Méthode), et a finalement découvert une méthode de traitement comme celle-ci dans MessageFormat:
// Indices pour segments privé statique final int seg_raw = 0; Final statique privé int seg_index = 1; Final statique privé int seg_type = 2; Final statique privé int seg_modifier = 3; // modificateur ou subformat / ** * Définit le modèle utilisé par ce format de message. * La méthode analyse le modèle et crée une liste de sous-formats * pour les éléments de format qui y sont contenus. * Les modèles et leur interprétation sont spécifiés dans le * <a href = "# motifs" rel = "externe nofollow"> Description de la classe </a>. * * @param motif le modèle pour ce format de message * @Exception illégalArgumentException Si le modèle est invalide * / @SuppressWarnings ("Fallthrough") // Fallthrough in Switch est attendu, supprime it public void applatch (String motif) {StringBuilder [] segments = new StringBuilder [4]; // allouer uniquement les segments [seg_raw] ici. Les autres sont // alloués à la demande. segments [seg_raw] = new StringBuilder (); int part = seg_raw; int formatNumber = 0; booléen enquête = 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); // gérer les doubles ++ i; } else {Enquête =! Enquête; }} else if (ch == '{' &&! Enquête) {part = seg_index; if (segments [seg_index] == null) {segments [seg_index] = new StringBuilder (); }} else {segments [partie] .append (ch); }} else {if (enquête) {// Copiez simplement les citations dans les segments de pièces [Part] .Apnd (ch); if (ch == '/' ') {enquête = false; }} else {switch (ch) {case ',': if (part <seg_modificier) {if (segments [++ part] == null) {segments [part] = new StringBuilder (); }} else {segments [partie] .append (ch); } casser; case '{': ++ bracestack; segments [partie] .APPEND (CH); casser; case '}': if (braceStack == 0) {part = seg_raw; Makeformat (i, formatNumber, segments); formatNumber ++; // Jetez d'autres segments de segments [seg_index] = null; segments [seg_type] = null; segments [SEG_MODIFIER] = null; } else {--bracestack; segments [partie] .APPEND (CH); } casser; case '': // ignore tous les principaux caractères d'espace pour seg_type. if (part! = seg_type || segments [seg_type] .length ()> 0) {segments [part] .append (ch); } casser; Cas '/' ': enquête = true; // tombe, nous gardons donc les citations dans d'autres parties par défaut: segments [partie] .append (ch); casser; }}}}} if (Bracestack == 0 && partie! = 0) {maxoffset = -1; Jetez un nouveau IllégalArgumentException ("Braces inégalées dans le motif."); } this.Pattern = segments [0] .toString (); }Le code ci-dessus est un peu déroutant et légèrement étrange. Nous examinons principalement la première branche logique: Traversé les caractères dans chaque chaîne de modèle de copie internationale en attente. Lorsque le personnage est "'", déterminez si le personnage suivant est également "'". Si c'est le cas, épissez "'" dans le STRINGBUILDER traité. Sinon, Enquête est vraie. Si le caractère ne fait pas '{' et que Enquête est faux, réinitialisez la pièce à 0, et si les segments [seg_index] = null, recréez l'objet StringBuilder, sinon continue d'épisser.
Analyse des causes:
Solution:
À partir du code source, il n'y a qu'une seule solution. Les citations simples entre {} doivent apparaître par paires. Notre façon de gérer est de modifier la copie vers:
tms.pallet.order.box.qty = la quantité totale de boîtes palettisées {0} ne correspond pas à la quantité de boîtes reçue {1}, veuillez vérifier!
La modification de la rédaction directement n'est pas une bonne solution. Il est préférable de pouvoir réécrire une méthode avant que Spring appelle la méthode ApplyPattern pour remplacer des devis simples par des devis doubles. Malheureusement, les méthodes de traitement international correspondantes du printemps 3.2.3 sont privées tout le temps, et elles ne vous donnent pas la possibilité de réécrire.
Après avoir consulté des informations pertinentes, vous pouvez constater que dans la version printemps 4.3.2, vous pouvez réécrire la méthode getStringorll dans la classe ResourceBundleMessageSource pour y parvenir.
Solution à long terme: mise à niveau de la version Spring dans le projet et utilisez plus de nouvelles fonctionnalités.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.