我正在开发一个应用程序,其中包含一个ViewScoped CDI bean和一个ViewScoped CDI bean。我正在使用2台GF4服务器(测试和生产)。
此bean在Primefaces DataTable上应用过滤器:
@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处理实体上的主要CRUD操作:
<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>
这两个bean用于以下JSF DataTable:
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]
在我的测试服务器中部署应用程序非常有效。在生产服务器中部署它会导致:
@ManagedBean (name = 'filterBean')
@ViewScoped
public class FilterBean {
....
...
}
为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:
BackgroundJob.Schedule(
() => Console.WriteLine("Reliable!"),
new DateTime(2015, 08, 05, 12, 00, 00));
完全相同的行为! 我的问题:
1)概念 - 如何在CDI中处理ViewScope要求? 2)具体问题 - 为什么我能够在一台服务器上成功部署而不能在另一台服务器上部署? 3)由于ViewScoped可用于CDI,ViewScoped bean可以在没有Serializable的情况下运行吗?
在我开始考虑将此作为一个可能的Glassfish问题之前,我想确保我做的事情正如JSF所做的那样。
谢谢!