JSF: как обновить базу одного сеансового компонента на другом сеансовом компоненте?

В настоящее время я модифицирую некоторое приложение jsf. У меня две фасоли.

  • соединениеБин
  • UIBean

Когда я устанавливаю параметры подключения в connectionBean в первый раз, UIBean может считывать информацию о моем connectionBean и отображать правильное дерево пользовательского интерфейса.

Однако, когда я пытаюсь установить параметры подключения в том же сеансе. Мой UIBean по-прежнему будет использовать предыдущую информацию о connectionBean.

Он будет использоваться только после того, как я аннулирую весь httpSession.

Могу ли я в любом случае заставить один сеансовый компонент обновить другой сеансовый компонент?


person Community    schedule 12.11.2008    source источник
comment
Есть ли у bean-компонентов общие параметры подключения или у UIBean есть ссылка на connectionBean?   -  person sblundy    schedule 12.11.2008
comment
Это коды поставщиков, я не уверен, могу ли я поделиться ими со всеми вами. UIBean имеет ссылку на connectionBean   -  person    schedule 13.11.2008


Ответы (3)


Мне кажется, что это какая-то проблема с UIBean, ссылающимся на устаревшую версию ConnectionBean. Это одна из проблем с JSF — если вы повторно создадите компонент, JSF не будет обновлять ссылки во всех других ваших компонентах.

Вы можете попробовать получить «свежую» копию ConnectionBean каждый раз. Следующий метод извлекает резервный компонент по имени:

protected Object getBackingBean( String name )
{
    FacesContext context = FacesContext.getCurrentInstance();

    return context
            .getApplication().createValueBinding( String.format( "#{%s}", name ) ).getValue( context );
}

Не зная специфики вашего кода и того, как вы используете bean-компоненты, трудно быть более конкретным!

person Community    schedule 13.11.2008

@Phill Sacre getApplication().createValueBinding устарел. Используйте эту функцию вместо JSF 1.2. Чтобы получить свежую копию файла bean.

protected Object getBackingBean( String name )
{
    FacesContext context = FacesContext.getCurrentInstance();

    Application app = context.getApplication();

    ValueExpression expression = app.getExpressionFactory().createValueExpression(context.getELContext(),
            String.format("#{%s}", name), Object.class);

    return expression.getValue(context.getELContext());
}
person Martlark    schedule 01.06.2009

Определите постоянный и статический метод в первом компоненте сеанса:

public class FirstBean {

public static final String MANAGED_BEAN_NAME="firstBean";

/**
 * @return current managed bean instance
 */
public static FirstBean getCurrentInstance()
{
  FacesContext context = FacesContext.getCurrentInstance();
  return (FirstBean) context.getApplication().evaluateExpressionGet(context, "#{" + FirstBean.MANAGED_BEAN_NAME + "}", TreeBean.class);
}  
...

чем использовать во втором сеансе bean-компонента следующим образом:

...  
FirstBean firstBean = FirstBean.getCurrentInstance();  
...

Лучшим подходом было бы использование некоторой среды Dependency Injection, такой как JSF 2 или Spring.

person Ondrej Bozek    schedule 15.02.2012