Prueba para el parámetro nulo en el archivo .properties para MessageFormat
-
21-09-2019 - |
Pregunta
¿Es posible, con paquetes de recursos y MessageFormat tener el siguiente resultado?
- cuando llamo
getBundle("message.07", "test")
para obtener"Group test"
- cuando llamo
getBundle("message.07", null)
para obtener"No group selected"
Todos los ejemplos que he encontrado en Internet es con los planetas, con los archivos en el disco y así sucesivamente.
Sólo tengo que comprobar si un parámetro es null
( o no existe ) en el archivo de propiedades del paquete de recursos. Espero encontrar un formato especial para el parámetro nulo algo así como {0,choice,null#No group selected|notnull#Group {0}}
.
El método que utilizo para obtener los paquetes es:
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 "???";
}
}
También llama a este método para otros paquetes, como
-
getBundle("message.08", 1, 2)
=>"Page 1 of 2"
(siempre parámetros, hay necesidad de comprobar paranull
) -
getBundle("message.09")
=>"Open file"
(sin parámetros, no hay necesidad de comprobarnull
)
¿Qué debo escribir en mis .properties para presentar message.07
tener el resultado descrito?
Lo que tenemos ahora es:
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
Solución
Su archivo .properties
,
message.07=Group {0}
message.08=Page {0} of {1}
message.09=Open file
message.null = No group selected
Y entonces usted necesita para cambiar su código para poner params
comprobación explícita para null
. Y si null
entonces usted puede hacer algo como resourceBundle.getString(NULL_MSG)
. Donde NULL_MSG
será esto,
private static final String NULL_MSG = "message.null";
Por lo tanto, ahora su método original se convertiría en algo como esto.
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;
}
Llamar a mi método, como a continuación:
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'
Ahora dime dónde está el problema?
Otros consejos
Voy a recomendar no tratar de cambiar la funcionalidad paquete (incluso si tiene un método getBundle encapsular él).
Basta con hacer en el código:
getBundle(param == null? "message.07.null": "message.07", param)
O hacer otro método:
getBundleOrNull("message.07", param, "message.07.null")
que hace
public String getBundleOrNull(String key, value, nullKey) {
return getBundle(value == null? nullKey: key: value);
}