我正在开发一个应用程序,主要包括SessionScoped CDI bean和一个ViewScoped CDI bean . 我正在使用2台GF4服务器(测试和 生产环境 ) .
此bean在Primefaces DataTable上应用过滤器:
@Named(value = "filterBean")
@ViewScoped
public class FilterBean {
private List<Clientactions> filterDept;
public FilterBean() {
}
public List<Clientactions> getFilterDept() {
return filterDept;
}
public List<Clientactions> getFilterDept() {
return filterDept;
}
public void setFilterDept(List<Clientactions> filterDept) {
this.filterDept = filterDept;
}
// rest of bean code
此bean处理实体上的主要CRUD操作:
@Named(value = "actionBean")
@SessionScoped
public class ActionBean implements Serializable {
public stDataModel<Clientactions> getActionList() {
if (actionList == null) {
actionList = makeActionList();
}
return actionList;
}
public ListDataModel<Clientactions> makeActionList() {
List<Clientactions> caList = facade.findAll();
ListDataModel<Clientactions> model
= new ListDataModel<Clientactions>(caList);
return model;
}
// rest of bean code
这两个bean用于以下JSF DataTable:
<p:dataTable id="actiontable" value="#{actionBean.actionList}" var="actions"
styleClass="borderless" filteredValue="#{filterBean.filterDept}" widgetVar="masterTable"
emptyMessage="No records with given criteria found">
<f:facet name="header">
<p:outputPanel>
<h:outputText value="Search all fields:" />
<p:inputText id="globalFilter" onkeyup="PF('masterTable').filter()"
style="width:150px" placeholder="Enter
</p:outputPanel>
</f:facet>
在我的测试服务器中部署应用程序非常有效 . 在 生产环境 服务器中部署它会导致:
015-08-06T08:45:49.183-0700] [glassfish 4.1] [SEVERE] [] [javax.enterprise.system.core] [tid: _ThreadID=42 _ThreadName=admin-listener(3)] [timeMillis: 1438875949183] [levelValue: 1000] [[
Exception while loading the app : CDI deployment failure:WELD-000072: Bean declaring a passivating scope must be passivation capable. Bean: Managed Bean [class com.mantramods.ion.beans.FilterBean] with qualifiers [@Default @Named @Any]
org.jboss.weld.exceptions.DeploymentException: WELD-000072: Bean declaring a passivating scope must be passivation capable. Bean: Managed Bean [class com.mantramods.ion.beans.FilterBean] with qualifiers [@Default @Named @Any]
向FilterBean实现Serializable可以修复部署问题,但生成的DataTable为空,然后主ActionBean无法访问 . 我也删除了 生产环境 服务器上的OSGI缓存,但这并没有解决问题 .
我对CDI中的ViewScoped bean感到困惑 . 我的研究表明,不建议在CDI中使用ViewScoped,因为这是一个JSF标准 . 我从那以后被BalusC开悟,JSF2.2为CDI提供了ViewScoped开箱即用 .
对我的异常做进一步的研究表明,通过实现Serializable来修复异常 . 但是,当我实现Serializable时,应用程序变得不稳定,我得到了“目标无法访问的标识符” . 这次异常发生在主actionBean上,当尝试在DataTable上做任何CRUD时,它会解析为null .
我尝试使用RequestScoped和ConversationScoped,但这导致了类似的行为 . 我怀疑我的问题与以下事实有关:当FilterBean实现Serializable时,两个bean用于处理相同的DataTable并发生冲突 . 在这种情况下,我不确定如何处理FilterBean的范围 . 我只知道主要的ActionBean应该保持SessionScoped .
我无法看到任何针对CDI bean的立即规则,因此我尝试将FilterBean作为JSF bean:
@ManagedBean (name = 'filterBean')
@ViewScoped
public class FilterBean {
....
...
}
完全一样的行为!我的问题:
1)概念 - 如何在CDI中处理ViewScope要求? 2)具体问题 - 为什么我能够在一台服务器上成功部署而不能在另一台服务器上部署? 3)由于ViewScoped可用于CDI,ViewScoped bean是否可以在没有Serializable的情况下运行?
在我开始考虑将此作为一个可能的Glassfish问题之前,我想确保我做的事情正如JSF所做的那样 .
谢谢!