跨两个GF服务器部署JSF ViewScoped CDI Bean不一致
我正在研究一个包含大部分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数据表:
<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时,应用程序变得不稳定,我得到'Target unreachable identifier。 这次,在尝试对DataTable执行任何CRUD时,主ActionBean会解析为null。
我尝试使用RequestScoped和ConversationScoped,但是这导致了类似的行为。 我怀疑我的问题与两个bean用于处理相同的DataTable并在FilterBean实现Serializable时发生冲突的事实有关。 在这种情况下,我不确定如何处理FilterBean的范围。 我只知道主要的ActionBean应该保持SessionScoped。
我看不到任何即时规则,我打破了CDI bean,所以我试图做一个JSF bean的FilterBean:
@ManagedBean (name = 'filterBean')
@ViewScoped
public class FilterBean {
....
...
}
完全一样的行为! 我的问题:
1)概念 - 如何在CDI中处理ViewScope需求? 2)具体问题 - 为什么我能够在一台服务器上成功部署,而不是另一台? 3)由于ViewScoped可用于CDI,ViewScoped bean的功能是否可用于Serializable?
在我开始考虑将此视为Glassfish问题之前,我希望确保自己能够像JSF那样做正确的事情。
谢谢!
链接地址: http://www.djcxy.com/p/62213.html上一篇: Inconsistent deployment of JSF ViewScoped CDI Bean accross two GF Servers
下一篇: Which CDI scope should be preferred for a JPA repository