Teste para o parâmetro nulo no .Properties Artigo para MessageFormat
-
21-09-2019 - |
Pergunta
É possível, com os pacotes de recursos e o MessageFormat ter o seguinte resultado?
- Quando eu ligo
getBundle("message.07", "test")
para obter"Group test"
- Quando eu ligo
getBundle("message.07", null)
para obter"No group selected"
Cada exemplo que encontrei na Internet está com planetas, com arquivos no disco e assim por diante.
Eu só preciso verificar se um parâmetro é null
(ou não existe) no arquivo de propriedades do pacote de recursos. Espero encontrar um formato especial para o parâmetro nulo algo como {0,choice,null#No group selected|notnull#Group {0}}
.
O método que eu uso para obter os pacotes é:
public String getBundle(String key, Object... params) {
try {
String message = resourceBundle.getString(key);
if (params.length == 0) {
return message;
} else {
return MessageFormat.format(message, params);
}
} catch (Exception e) {
return "???";
}
}
Eu também chamo esse método para outros pacotes, como
getBundle("message.08", 1, 2)
=>"Page 1 of 2"
(sempre parâmetros, não há necessidade de verificarnull
)getBundle("message.09")
=>"Open file"
(Sem parâmetros, não há necessidade de verificarnull
)
O que devo escrever no meu arquivo .Properties para message.07
Para ter o resultado descrito?
O que tenho agora é:
message.07=Group {0}
message.08=Page {0} of {1} # message with parameters where I always send them
message.09=Open file # message without parameters
Solução
Sua .properties
Arquivo,
message.07=Group {0}
message.08=Page {0} of {1}
message.09=Open file
message.null = No group selected
E então você precisa alterar seu código para fazer uma verificação explícita params
por null
. E se null
Então você pode fazer algo como resourceBundle.getString(NULL_MSG)
. Onde NULL_MSG
será isso,
private static final String NULL_MSG = "message.null";
Então, agora seu método original se tornaria algo assim.
public String getBundle(String key, Object... params) {
String message = null;
try {
if (params == null) {
message = resourceBundle.getString(NULL_MSG);
} else {
message = MessageFormat.format(resourceBundle.getString(key), params);
}
} catch (Exception e) {
e.printStackTrace();
}
return message;
}
Chamando meu método como abaixo,
getBundle("message.07", "test") // returning 'Group test'
getBundle("message.07", null) // returning 'No group selected'
getBundle("message.08", 1, 2) // returning 'Page 1 of 2'
getBundle("message.08", null) // returning 'No group selected'
getBundle("message.09", new Object[0]) // returning 'Open file'
getBundle("message.09", null) // returning 'No group selected'
Agora me diga onde está o problema?
Outras dicas
Eu recomendo não tentar alterar a funcionalidade do pacote (mesmo se você tiver um método getBundle que a encapsulou).
Simplesmente faça em seu código:
getBundle(param == null? "message.07.null": "message.07", param)
Ou faça outro método:
getBundleOrNull("message.07", param, "message.07.null")
Isso faz
public String getBundleOrNull(String key, value, nullKey) {
return getBundle(value == null? nullKey: key: value);
}