Escrito en el artículo anterior: durante mucho tiempo, el artículo registrará principalmente los problemas reales encontrados en algunos proyectos y las soluciones correspondientes. Al analizar el código correspondiente, señalará directamente el problema y no publicará códigos de proceso irrelevantes. Los lectores interesados pueden rastrearlos ellos mismos. Al mismo tiempo, espero que todos puedan compartir sus experiencias en el área de comentarios para que todos puedan progresar juntos.
Entorno o versión: primavera 3.2.3
Fenómeno: el propio MessageSource de Spring se utiliza para procesar la redacción internacional. Algunos marcadores de posición en la redacción del estado de los Estados Unidos no han sido reemplazados, lo cual es normal en el estado de CN. La redacción es la siguiente:
tms.pallet.order.box.qty = La cantidad total de cuadros paletizados {0} no coincide con la cantidad de cuadros recibidos {1}, ¡duplicen!
tms.pallet.order.box.qty = número total de cuadros para abordar {0}, que es inconsistente con el número total de cuadros para el recibo de pedidos {1}. ¡Comprueba, por favor!
Intuición: ¿Es demasiado larga la redacción inglesa? La primavera ha restringido la longitud al procesarlo. Después de pensar con cuidado, la primavera no debería ser tan lamentable.
Solución de problemas: los puntos de interrupción rastrean el código fuente de Spring (entrada: Método de GetMessage de Messagesurce), y finalmente descubrió un método de procesamiento como este en MessageFormat:
// Índices para segmentos static finales finales int seg_raw = 0; Private estático final int seg_index = 1; Private estático final int seg_type = 2; Private estático final int seg_modifier = 3; // modificador o subformat/*** Establece el patrón utilizado por este formato de mensaje. * El método analiza el patrón y crea una lista de subformatos * para los elementos de formato contenidos en él. * Los patrones y su interpretación se especifican en * <a href = "#patrones" rel = "nofollow externo"> Descripción de la clase </a>. * * @param Patrón El patrón para este formato de mensaje * @Exception ilegalargumentException Si el patrón es inválido */ @supplesswarnings ("fallthrough") // se espera que el switch lo suprima, lo público void aplica (patrón de cadena) {StringBuilder [] segments = new StringBuilder [4]; // Asignar solo segmentos [SEG_RAW] aquí. El resto están // asignados a pedido. segmentos [seg_raw] = new StringBuilder (); int parte = Seg_raw; int formatNumber = 0; boolean consultate = false; int bracestack = 0; maxoffset = -1; for (int i = 0; i <patrón.length (); ++ i) {char ch = patrón.charat (i); if (parte == seg_raw) {if (ch == '/' ') {if (i + 1 <patrón.length () && pattern.charat (i + 1) =='/'') {segmentos [parte] .Append (ch); // manejar dobles ++ i; } else {consulte =! Involiar; }} else if (ch == '{' &&! Investigue) {par = seg_index; if (segmentos [seg_index] == null) {segmentos [seg_index] = new StringBuilder (); }} else {segmentos [parte] .Append (ch); }} else {if (consulte) {// simplemente copie las cotizaciones en segmentos de partes [parte] .Append (CH); if (ch == '/' ') {consultote = false; }} else {switch (ch) {case ',': if (parte <seg_modifier) {if (segments [++ parte] == null) {segmentos [parte] = new StringBuilder (); }} else {segmentos [parte] .Append (ch); } romper; case '{': ++ bracestack; segmentos [parte] .append (CH); romper; case '}': if (bracestack == 0) {part = seg_raw; makeformat (i, formatnumber, segmentos); FormatNumber ++; // tirar otros segmentos segmentos [seg_index] = null; segmentos [seg_type] = null; segmentos [seg_modifier] = null; } else {--bracestack; segmentos [parte] .append (CH); } romper; case '': // omita cualquier chars espacial líder para SEG_TYPE. if (parte! = seg_type || segmentos [seg_type] .length ()> 0) {segmentos [parte] .append (ch); } romper; case '/' ': consulte = true; // caer, por lo que mantenemos citas en otras partes predeterminadas: segmentos [parte] .Append (CH); romper; }}}}} if (bracestack == 0 && par! = 0) {maxoffset = -1; tirar nueva ilegalargumentException ("aparatos ortopédicos inigualables en el patrón"); } this.pattern = segments [0] .ToString (); }El código anterior es un poco confuso y ligeramente extraño. Principalmente observamos la primera rama lógica: atraviese los caracteres en cada cadena de plantilla de copia internacional pendiente. Cuando el personaje es "'", determine si el siguiente personaje también es "'". Si es así, empalme "'" en el StringBuilder procesado. Si no, la investigación es verdadera. Si el personaje no '{' y la investigación es falsa, entonces restablezca la parte a 0, y si segmentos [seg_index] = null, recree el objeto StringBuilder, de lo contrario continúe empalmando.
Análisis de causa:
Solución:
Del código fuente, solo hay una solución. Las citas individuales entre {} deben aparecer en pares. Nuestra forma de manejo es modificar la copia a:
tms.pallet.order.box.qty = La cantidad total de cuadros paletizados {0} no coincide con la cantidad de cuadros recibidos {1}, ¡duplique la verificación!
Modificar la redacción directamente no es una buena solución. Es mejor poder reescribir un método antes de que Spring llame al método ApplicPattern para reemplazar las cotizaciones únicas con cotizaciones dobles. Desafortunadamente, los métodos de procesamiento internacional correspondientes en la primavera 3.2.3 son privados en todo momento, y no le dan la oportunidad de reescribir.
Después de consultar información relevante, puede encontrar que en la versión Spring 4.3.2, puede reescribir el método GetStringOnnull en la clase ResourceBundLemesSageSource para lograrlo.
Solución a largo plazo: actualice la versión de resorte en el proyecto y use más funciones nuevas.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.