Несоответствие с @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
,