как использовать bean-компонент ViewScoped в bean-компоненте SesionScoped?

У меня есть три управляемых компонента: один сеанс (S) и два представления (A, B). Я хочу использовать функциональность A как в S, так и в B. но проблема в том, что внедрение bean-компонента с областью видимости в область действия сеанса невозможно.

The scope of the object referenced by expression #{a}, view, is shorter than the referring managed beans (s) scope of session

Я не хочу дублировать функциональность A. Есть идеи?


person Taher Khorshidi    schedule 22.01.2014    source источник


Ответы (3)


Это просто указывает на конструктивную проблему в вашей модели. Это говорит о том, что класс компонента A с областью действия представления имеет «слишком много» логики кода и что его код следует реорганизовать в другой повторно используемый класс, который, в свою очередь, может использоваться как классом компонента S с областью действия сеанса, так и классом компонента A с областью действия представления. < href="http://en.wikipedia.org/wiki/Law_of_Demeter" rel="nofollow noreferrer">Закон Деметры и тому подобное. Возможно, он представляет код бизнес-службы, который на самом деле должен быть в EJB?

В любом случае вы можете выполнить требование, передав компонент A с областью действия вида в качестве аргумента метода метода действия компонента S с областью действия сеанса.

<h:commandXxx ... action="#{sessionScopedBean.doSomething(viewScopedBean)}" />

Но это тоже дизайнерский запах. Вы должны быть абсолютно уверены, что выбрали правильную область для данных/состояния, которые содержит компонент. См. также Как правильно выбрать область действия bean-компонента?

person BalusC    schedule 22.01.2014

Ошибка довольно ясна. Область сеанса больше, чем область представления. Следовательно, вы не можете использовать его в области сеанса. Вы должны изменить свои масштабы.

Вы объявляете свой bean-компонент A как область представления, что означает, что вы не хотите, чтобы он жил после изменения представления. Таким образом, внедрение его в область сеанса является нарушением его правила.

person Madhura    schedule 22.01.2014
comment
Вы можете изменить область A на sessionscope или область S на viewscope. - person Madhura; 22.01.2014
comment
Мне действительно нужно, чтобы A был в поле зрения, а S в сеансе! - person Taher Khorshidi; 22.01.2014
comment
Нет, вы не можете его использовать. И даже если бы вы это сделали, это не имело бы никакого смысла. Если вы хотите, чтобы к вашим переменным обращались в компоненте области сеанса, а не в области просмотра, вы должны поместить их в компонент области сеанса. Поделитесь своим кодом, чтобы я мог больше помочь для обходного пути - person Madhura; 22.01.2014
comment
S должен беспокоиться только о вопросах сеанса. Никогда о специфике A, которая должна быть связана с представлением. Вместо этого вы можете сделать A доступом к S, чтобы уведомлять его об изменениях. - person Xtreme Biker; 22.01.2014

Я понял. JSF изменил способ внедрения вещей. Смотрите ниже правильный путь:

@Named(value = "propertyFEnd")
@ViewScoped
public class PropertyFEnd implements Serializable {

    @Inject @ManagedProperty("#{userFEnd}")
    private UserFEnd userfend;

     **** plus getter/setter for userfend ***

     **** your code ****

}

Не используйте @ManagedBean сверху!!!! Примечание: UserFEnd — это сессионный компонент.

Надеюсь это поможет.

person JediSal    schedule 28.04.2017
comment
это прямо противоположно тому, что просили - person martinyyyy; 25.10.2017