Благодаря этому сообщению, https://stackoverflow.com/a/28047512/1227941, я теперь использую CDI, чтобы сделать msg доступным в моих @Named beans следующим образом:
@RequestScoped
public class BundleProducer {
@Produces
public PropertyResourceBundle getBundle() {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().evaluateExpressionGet(context, "#{msg}", PropertyResourceBundle.class);
}
}
С инъекцией вроде:
@Inject
private PropertyResourceBundle bundle;
Вопрос: Что делать, если у меня больше файлов свойств: ui.properties, admin.properties ...?
Я также ищу лучшие практики по этому поводу.
Во-первых, я бы посоветовал вам произвести ResourceBundle вместо конкретного PropertyResourceBundle. Затем вы можете использовать квалификатор CDI, чтобы различать различные пакеты.





Я бы просто использовал аннотацию классификатора, чтобы выбрать, какой пакет внедрять. Вырвано из моего небольшого проекта:
Аннотация:
@Qualifier
@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface Bundle {
@Nonbinding
public String value() default "";
}
Метод производителя (при необходимости адаптируйте к вашему контексту):
@Produces @Bundle ResourceBundle loadBundle(InjectionPoint ip) {
String bundleName = ip.getAnnotated().getAnnotation(Bundle.class).value();
ResourceBundle res = ResourceBundle.getBundle(bundleName);
return res;
}
И инъекция:
@Inject @Bundle("ui")
private ResourceBundle uiResources;
Классно, просто, но гибко.
@mtj У меня следующее исключение: Exception during lifecycle processing org.glassfish.deployment.common.DeploymentException: CDI deployment failure:WELD-001408: Unsatisfied dependencies for type ResourceBundle with qualifiers @Bundle at injection point [BackedAnnotatedField] @Inject @Bundle private com.mypckage.MyBean.uiResources Любая помощь, пожалуйста
@Hicham Не могли бы вы опубликовать код, как сейчас?
Интерфейс пакета package com.locale;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import javax.enterprise.util.Nonbinding;import javax.inject.Qualifier;@Qualifier@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)public atinterface Bundle { `@ Nonbinding`` public String value () default ""; `}
BundleProducer package com.locale; import java.util.ResourceBundle; import javax.enterprise.inject.Produces; import javax.enterprise.inject.spi.InjectionPoint; public class BundleProducer { atProduces atBundle public ResourceBundle loadBundle(InjectionPoint ip) { String bundleName = ip.getAnnotated().getAnnotation(Bundle.class).value(); ResourceBundle res = ResourceBundle.getBundle(bundleName); return res; } }, использующий ResourceBundle @Inject @Bundle("user") private BundleProducer uiResources;
@Hicham Согласно опубликованному вами коду, вы вводите BundleProducer, а не ResourceBundle. С другой стороны, сообщение об ошибке говорит о другом. Поскольку это обсуждение в комментариях создает большой беспорядок, я предлагаю вам открыть новый вопрос с описанием текущей настройки, текущего кода и, возможно, ссылкой на этот. (Это также может привлечь участников, которые находятся не дальше 12 часов от вас, чтобы вы могли быстрее реагировать.)
Большое спасибо @mti, только что разместил здесь новый вопрос: ссылка на сайт
Я лично стараюсь держать количество сообщений на низком уровне и использовать «составные ключи» (ui.xxx, admin.yyy). Не знаю, является ли это наилучшей практикой или нет, но он выполняет свою работу за меня.