Прежде всего, вы перепутали varName/baseName подходов. Фактические подходы:
Application#getResourceBundle()
varName
: это строка, представляющая <resource-bundle><var>
в faces-config.xml
FacesContext context = FacesContext.getCurrentInstance();
Application application = context.getApplication();
ResourceBundle bundle = application.getResourceBundle(context, varName);
ResourceBundle#getBundle()
baseName
: полное имя пакета ресурсов, например <resource-bundle><base-name>
.
FacesContext context = FacesContext.getCurrentInstance();
Locale locale = context.getViewRoot().getLocale();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale, loader);
Первый получает его через JSF Application
, который под прикрытием также использует UIViewRoot#getLocale()
(с откатом к Locale#getDefault()
), а второй получает его напрямую.
Что касается техники и конечного результата, то разницы никакой. Вы получите один и тот же пакет в обоих случаях (при условии, что локаль правильная). Однако, что касается ремонтопригодности, это определенно отличается. Пакеты ресурсов подпадают под конфигурацию и должны быть экстернализованы (в faces-config.xml
).
Жесткое кодирование FQN, как в baseName
, является плохой практикой. Вы не можете легко и быстро изменить FQN без повторной компиляции и повторной сборки всего кода. Если бы это было в стороннем файле JAR, это было бы еще более проблематично. В противном случае вы могли бы просто переопределить его другим <resource-bundle>
на том же <var>
из своего веб-приложения. Кроме того, библиотеки компонентов/служебных программ JSF могут предоставлять собственную оболочку Application
, которая, возможно, могла бы украсить вызов getResourceBundle()
, чтобы сделать его удивительным. Это было бы невозможно, если бы вы получили его напрямую через ResourceBundle#getBundle()
.
Есть, кстати, и третий подход: просто ввести его.
В управляемом компоненте JSF предоставлено <var>text</var>
:
@ManagedProperty("#{text}")
private ResourceBundle text;
Или в управляемом компоненте CDI:
@Inject
private PropertyResourceBundle text;
С этим производителем:
public class BundleProducer {
@Produces
public PropertyResourceBundle getBundle() {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().evaluateExpressionGet(context, "#{text}", PropertyResourceBundle.class);
}
}
Примечание: оценка EL пакета #{text}
используется под обложками Application#getResourceBundle()
.
person
BalusC
schedule
13.01.2015