Escrito no artigo anterior: Por um longo tempo, o artigo registrará principalmente os problemas reais encontrados em alguns projetos e as soluções correspondentes. Ao analisar o código correspondente, ele apontará diretamente o problema e não publicará códigos de processo irrelevantes. Os leitores interessados podem rastreá -los. Ao mesmo tempo, espero que todos possam compartilhar suas experiências na área de comentários para que todos possam progredir juntos!
Ambiente ou versão: Spring 3.2.3
Fenômeno: a própria Mensagem da Spring é usada para processar redatores internacionais. Alguns espaços reservados na redação no estado dos EUA não foram substituídos, o que é normal no estado da CN. A redação é a seguinte:
tms.pallet.order.box.qty = A quantidade total de caixas paletizadas {0} não corresponde à quantidade de caixas recebidas {1}, verifique duas vezes!
tms.pallet.order.box.qty = número total de caixas para embarque {0}, que é inconsistente com o número total de caixas para o recebimento do pedido {1}. Verifique, por favor!
Intuição: a redação inglesa é muito longa? A primavera restringiu o comprimento ao processá -lo. Depois de pensar com cuidado, a primavera não deve ser tão lamentável.
Solução de problemas: os pontos de interrupção rastreiam o código -fonte da primavera (Entrada: MessageRce GetMessage Method) e, finalmente, descobri um método de processamento como este no MessageFormat:
// índices para segmentos privados estáticos final 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 ou subformat/*** define o padrão usado por este formato de mensagem. * O método analisa o padrão e cria uma lista de subformatos * para os elementos de formato contidos nele. * Os padrões e sua interpretação são especificados no * <a href = "#padrões" rel = "Nofollow externo"> Descrição da classe </a>. * * Padrão @param O padrão para este formato de mensagem * @Exception ilegalarGumentException Se o padrão for inválido */ @suppresswarnings ("Fallthrough") // Fallthrough no comutador é esperado, suprime o publicbuilder ApplyPattern (Pattern) {Stringbuilder [] segmentos = novo StringBuilder [4]; // alocam apenas segmentos [seg_raw] aqui. O restante é // alocado sob demanda. segmentos [seg_raw] = new StringBuilder (); int parte = seg_raw; int formatNumber = 0; Inquérito booleano = false; Int BraceStack = 0; maxoffset = -1; for (int i = 0; i <padrão.Length (); ++ i) {char ch = padring.charat (i); if (parte == SEG_RAW) {if (ch == '/' ') {if (i + 1 <padrão.length () && Pattern.Charat (i + 1) =='/'') {segmentos [parte] .append (ch); // manipula duplas ++ i; } else {inquester =! Inquérito; }} else if (ch == '{' &&! Inquérito) {parte = seg_index; if (segmentos [seg_index] == null) {segmentos [seg_index] = new StringBuilder (); }} else {segmentos [parte] .append (ch); }} else {if (inquérito) {// apenas copie aspas nos segmentos de peças [parte] .append (ch); if (ch == '/' ') {inquester = false; }} else {switch (ch) {case ',': if (parte <seg_modifier) {if (segmentos [++ parte] == null) {segmentos [parte] = new StringBuilder (); }} else {segmentos [parte] .append (ch); } quebrar; case '{': ++ BRACESTACK; segmentos [parte] .append (ch); quebrar; case '}': if (braceStack == 0) {parte = seg_raw; MakeFormat (i, formatNumber, segmentos); formatNumber ++; // joga fora outros segmentos de segmentos [seg_index] = null; segmentos [seg_type] = null; segmentos [seg_modifier] = null; } else {--braCestack; segmentos [parte] .append (ch); } quebrar; case '': // pule qualquer chares espaciais líderes para seg_type. if (parte! = seg_type || segmentos [seg_type] .length ()> 0) {segmentos [parte] .append (ch); } quebrar; case '/' ': Inquérito = true; // cair, então mantivemos aspas em outras peças padrão: segmentos [parte] .append (ch); quebrar; }}}}} if (braceStack == 0 && parte! = 0) {maxoffset = -1; lançar novas ilegalargumentException ("aparelhos incomparáveis no padrão"); } this.pattern = segmentos [0] .ToString (); }O código acima é um pouco confuso e um pouco estranho. Observamos principalmente a primeira filial lógica: atravesse os caracteres em cada string de modelo de cópia internacional pendente. Quando o personagem for "'", determine se o próximo personagem também é "'". Nesse caso, emanete "'" no StringBuilder processado. Caso contrário, o inquérito é verdadeiro. Se o caractere não '{' e o Inquérito for falso, redefine a parte para 0 e se segmentos [seg_index] = nulo, recrie o objeto Stringbuilder, de outra forma continuar em splicing.
Análise de causa:
Solução:
Do código -fonte, existe apenas uma solução. Citações únicas entre {} precisam aparecer em pares. Nossa maneira de lidar é modificar a cópia para:
tms.pallet.order.box.qty = A quantidade total de caixas paletizadas {0} não corresponde à quantidade de caixas recebidas {1}, verifique novamente!
Modificar diretamente a redação não é uma boa solução. É melhor poder reescrever um método antes da primavera chama o método ApplyPattern para substituir citações únicas por cotações duplas. Infelizmente, os métodos internacionais de processamento internacional correspondentes na primavera 3.2.3 são privados o tempo todo e não lhe dão a chance de reescrever.
Após consultar informações relevantes, você pode descobrir que, na versão da primavera 4.3.2, você pode reescrever o método GetTringornull na classe ResourceBundLemessagesource para alcançá -la.
Solução de longo prazo: atualize a versão da primavera no projeto e use mais novos recursos.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.