CDI @Produces с несколькими файлами свойств

Благодаря этому сообщению, 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 ...?

Я лично стараюсь держать количество сообщений на низком уровне и использовать «составные ключи» (ui.xxx, admin.yyy). Не знаю, является ли это наилучшей практикой или нет, но он выполняет свою работу за меня.

Kukeltje 13.08.2018 11:39

Я также ищу лучшие практики по этому поводу.

Hicham 13.08.2018 12:05

Во-первых, я бы посоветовал вам произвести ResourceBundle вместо конкретного PropertyResourceBundle. Затем вы можете использовать квалификатор CDI, чтобы различать различные пакеты.

Nikos Paraskevopoulos 13.08.2018 18:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
453
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы просто использовал аннотацию классификатора, чтобы выбрать, какой пакет внедрять. Вырвано из моего небольшого проекта:

Аннотация:

@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;

Классно, просто, но гибко.

Kukeltje 14.08.2018 08:10

@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 14.08.2018 19:07

@Hicham Не могли бы вы опубликовать код, как сейчас?

mtj 15.08.2018 07:16

Интерфейс пакета 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 ""; `}

Hicham 15.08.2018 22:04

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 15.08.2018 22:05

@Hicham Согласно опубликованному вами коду, вы вводите BundleProducer, а не ResourceBundle. С другой стороны, сообщение об ошибке говорит о другом. Поскольку это обсуждение в комментариях создает большой беспорядок, я предлагаю вам открыть новый вопрос с описанием текущей настройки, текущего кода и, возможно, ссылкой на этот. (Это также может привлечь участников, которые находятся не дальше 12 часов от вас, чтобы вы могли быстрее реагировать.)

mtj 16.08.2018 07:41

Большое спасибо @mti, только что разместил здесь новый вопрос: ссылка на сайт

Hicham 16.08.2018 15:00

Другие вопросы по теме