跨两个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