Каков идиоматический способ получения ссылок на другие управляемые компоненты? - PullRequest
1 голос
/ 28 июня 2011

На мой взгляд, существует три способа получить ссылку на другой компонент:

  1. Используя CDI, я могу @Inject именованный компонент.Это имеет тот недостаток, что CDI-аннотации плохо сочетаются с гранями-аннотациями, и поэтому я больше не могу использовать @ViewScoped.
  2. Использование @ManagedProperty кажется идеальным, за исключением того, что у меня естьввести общедоступный установщик для этого, что вредит инкапсуляции.
  3. Я могу использовать что-то вроде этого (предложено в этот ответ ):

    @SuppressWarnings("unchecked")
    public static <T> T findBean(String beanName) {
        FacesContext context = FacesContext.getCurrentInstance();
        return (T) context.getApplication().evaluateExpressionGet(
            context, "#{" + beanName + "}", Object.class);
    }
    

    Я могу использовать этот метод для инициализации свойств в моем @PostConstruct.Это не имеет ни одного из вышеперечисленных недостатков, но кажется немного сложным.Зачем мне писать вспомогательный метод для чего-то, что должен предоставить фреймворк?

Мой вопрос: какой из трех приведенных выше мне следует использовать?Кроме того, не стесняйтесь исправлять любые заблуждения, которые я мог изложить в приведенном выше описании, или предлагать другие (более изящные) методы для достижения этой цели.

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

Если вы действительно не можете богить без @ViewScoed и хотите остаться только с JSF и CDI - тогда 2-й. Не беспокойтесь об инкапсуляции для внешних зависимостей. Даже вне контекста лица вам все равно придется каким-то образом установить другой объект, так что сеттер необходим.

Если вы хотите добавить шов к рисунку и все равно используете CDI, то 1-й. Смотрите ответ Джан Грот.

2 голосов
/ 29 июня 2011

Определенно 1-й, вместе с Лицом 3 Шва ( здесь ). Просто поместите его в свой путь к классу, и @Viewscoped идеально соединит CDI и JSF :-) Нет необходимости упоминать, что CDI имеет гораздо лучшую концепцию для внедрения зависимостей, чем та, с которой поставляется JSF ...

...