Несоответствие с @ManagedProperty

У меня есть бин со списком глобальных данных в @ApplicationScoped, как это:

@ApplicationScoped
@ManagedBean
public class GlobalData
{
  private List data = new ArrayList();

  //getter and setterss goes here.. 

  public void addSomeData(Object item) { data.add(item); }
}

Также у меня есть компонент @ViewScoped, который ссылается на GlobalData через @ManagedProperty, например:

@ManagedBean
@ViewScoped
public class SomePageController
{
   @ManagedProperty(value="#{globalData}"
   private GlobalData theGlobalData;
   //also public getter and setter of theGlobalData
}

Самое смешное происходит, когда в SomePageController я хочу добавить элемент в список GlobalData, например так:

public void someUIAction()
{
    SomeItem item = bussinesProcess();
    theGlobalData.addSomeData( item );
}

потому что каждый раз, когда вызывается someUIAction, theGlobalData указывает на совершенно новый экземпляр с пустыми данными!!!! Я могу подтвердить это, потому что я добавил некоторую информацию о логине, например:

public void someUIAction()
{
    SomeItem item = bussinesProcess();
    theGlobalData.addSomeData( item );
    System.out.println(theGlobalData.toString());
}

и тогда я получил следующий вывод:

com.myproyect.beans.GlobalData@3c76da81
com.myproyect.beans.GlobalData@19c1818a
com.myproyect.beans.GlobalData@9a7jp79c
......

новый экземпляр при каждом запросе, я гуглил, но единственную информацию, которую я мог получить, - об этом парне с похожей проблемой, но я также пытался решить его без удачи = (.

** дополнительная информация **: я разрабатываю с веб-профилем TomEE 1.5.2, который включает Apache MyFaces, а также я проверил, что все аннотации взяты из пакета javax.faces.bean

1 ответ

Это произойдет, если вы импортировали @ApplicationScoped аннотации из неправильного пакета, такого как CDI javax.enterprise.contextЭто то, что большинство IDE предлагают в качестве первого варианта автозаполнения. Как вы управляете бобами с помощью JSF @ManagedBeanзатем необходимо убедиться, что вы также используете управляемую область bean-компонента из того же API-интерфейса управления bean-компонентом.

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

Когда управляемый JSF-компонент не может определить действительную аннотацию, по умолчанию используется @NoneScoped что в данном конкретном случае действительно новый экземпляр на каждом EL-разрешении, например @ManagedProperty,

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