在WebLogic上执行按钮操作后重新创建@ViewScoped

时间:2016-06-07 17:55:27

标签: jsf jsf-2 primefaces weblogic

首先,我知道关于我的标题的其他类似问题,但我的问题有点不同......当我尝试在我的LazyDataModel Bean中初始化@ViewScoped时,它工作正常,直到我单击我页面上的actionButton。创建My Bean时,其@PostConstruct方法按预期工作,并在该方法中填充LazyDataModel,然后填充数据表。但是当我的页面中的actionButton调用ajax时,会重新创建整个bean并再次调用@PostConstruct方法,并将LazyDataModel值更改为null。因此,我的页面崩溃了。在另一种情况下,我在我的数据表中使用rowSelect事件而不是使用具有SelectEvent参数的方法的actionButton。在SelectEvent中,参数对象字段为null,我得到了NullPointerException。这些是场景......结果我猜我在我的@ViewScoped bean中使用LazyDataModel它再次调用PostConstruct,我的datamodel为我的SelectEvent方法返回null。

这是我的ViewScoped PostConstruct方法

@ManagedBean (name = "myEctrInboxBB")
@ViewScoped
public class MyEContractInboxBackingBean implements Serializable {

private static final long serialVersionUID = 2399679621562918360L;

private static final Logger logger = LogManager.getLogger(MyEContractInboxBackingBean.class);

@ManagedProperty("#{ectrDomainService}")
EContractDomainService ectrDomainService;

@ManagedProperty("#{eContractUtil}")
EContractUtilBean eContractUtil;

@ManagedProperty("#{ectrApproveController}")
EContractApproveControllerBean ectrApproveController;

private EContractInboxItem selectedInboxRow;
private LazyEContractInboxItemModel lazyEcontractInboxItem;

private List<EContractInboxItem> inboxItems = new ArrayList<EContractInboxItem>();
private List<EContractInboxItem> filteredInboxItems = new ArrayList<EContractInboxItem>();

@PostConstruct
public void init() {

    User portalUser = getUser();
    List<String> userRoles = fetchUserRoles(portalUser);
    List<String> userSmCodes = fetchUserSmCodes(userRoles, portalUser);

    lazyEcontractInboxItem = new LazyEContractInboxItemModel(ectrDomainService, eContractUtil, userRoles, userSmCodes);


}

public void onRowSelect(SelectEvent selectEvent) {
    logger.info("**************************" + selectEvent);
}

public void openSelectedJob(EContractInboxItem item) {
ectrApproveController.openEContractInfoPage(item.getProcessInstanceId());
}

LazyDataModel

public class LazyEContractInboxItemModel extends LazyDataModel<EContractInboxItem>{

List<EContractInboxItem> inboxItems = new ArrayList<EContractInboxItem>();
List<Task> taskList = new ArrayList<Task>();

EContractDomainService ectrDomainService;
EContractUtilBean ectrUtilBean;

List<String> userRoles = new ArrayList<String>();
List<String> userSmCodes = new ArrayList<String>();

public LazyEContractInboxItemModel(EContractDomainService ectrDomainService, EContractUtilBean utilBean, List<String> roles,
        List<String> smCodes) {

    userRoles.addAll(roles);
    userSmCodes.addAll(smCodes);
    ectrUtilBean = utilBean;

    this.ectrDomainService = ectrDomainService;
}


public List<EContractInboxItem> getInboxItems() {
    return inboxItems;
}

public void setInboxItems(List<EContractInboxItem> inboxItems) {
    this.inboxItems = inboxItems;
}



@Override
public List<EContractInboxItem> load(int first, int pageSize, String sortField, SortOrder sortOrder,
        Map<String, Object> filters) {
    taskList = ectrDomainService.findTaskListAssignedToUserByUser(userRoles, userSmCodes);

    inboxItems.clear();

    inboxItems.addAll(ectrUtilBean.retrieveInboxItems(taskList));

    setRowCount(inboxItems.size());

    return inboxItems;
}


@Override
public List<EContractInboxItem> load(int first, int pageSize, List<SortMeta> multiSortMeta,
    Map<String, Object> filters) {
    taskList = ectrDomainService.findTaskListAssignedToUserByUser(userRoles, userSmCodes);

    inboxItems.clear();

    inboxItems.addAll(ectrUtilBean.retrieveInboxItems(taskList));

    setRowCount(inboxItems.size());

    return inboxItems;
}


@Override
public Object getRowKey(EContractInboxItem object) {
    return object.getProcessInstanceId();
}


@Override
public EContractInboxItem getRowData() {
    return super.getRowData();
}


@Override
public EContractInboxItem getRowData(String rowKey) {

    for (EContractInboxItem eContractInboxItem : inboxItems) {
        if (rowKey.equals(eContractInboxItem.getProcessInstanceId()))
            return eContractInboxItem;

    }
    return null;

}
getters and setters

带有actionButton的xhtml页面

<?xml version="1.0"?>
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:pe="http://primefaces.org/ui/extensions">

<h:form
    id="eContractWaitingApprovalForm"
    prependId="false"
    enctype="multipart/form-data">

    <p:messages id="topmsgForEcontractWaitingApproval" />

    <div class="ui-grid ui-grid-responsive">
            <p:dataTable
                id="waitingEcontracts"
                widgetVar="waitingEcontracts"
                styleClass="grid-sm-bottom"
                rows="20"
                resizableColumns="true"
                resizeMode="expand"
                paginator="true"
                lazy="true"
                paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                rowsPerPageTemplate="5,10,15,50,100,200"
                value="#{myEctrInboxBB.lazyEcontractInboxItem}"
                var="item">

                <p:column
                    styleClass="center-column"
                    headerText="#{i18n['e-contract.dt.waiting.agreement.no']}">
                    <h:outputText value="#{item.eContract.eContractCode}" />
                </p:column>

                <p:column
                    styleClass="center-column"
                    headerText="#{i18n['e-contract.dt.waiting.agreement.subject']}">
                    <h:outputText value="#{item.eContract.eContractSubject}" />
                </p:column>

                <p:column
                    styleClass="center-column"
                    headerText="#{i18n['e-contract.dt.waiting.agreement.date']}">
                    <h:outputText value="#{item.eContract.eContractDate}">
                        <f:convertDateTime
                            type="date"
                            pattern="dd-MM-yyyy" />
                    </h:outputText>
                </p:column>

                <p:column
                    styleClass="center-column"
                    headerText="#{i18n['e-contract.dt.waiting.agency.name']}">
                    <h:outputText value="#{item.agencyName}" />
                </p:column>

                <p:column
                    styleClass="center-column"
                    headerText="#{i18n['e-contract.dt.waiting.agency.type']}">
                    <h:outputText value="#{item.agencyType}" />
                </p:column>

                <p:column
                    styleClass="center-column"
                    headerText="#{i18n['e-contract.dt.waiting.agency.sales.manager']}">
                    <h:outputText
                        value="#{myEctrInboxBB.findSalesOfficeBySmCode(item.agencySM)}" />
                </p:column>

                <p:column
                    styleClass="center-column"
                    headerText="#{i18n['e-contract.dt.waiting.agreement.status']}">
                    <h:outputText
                        value="#{item.eContract.eContractStatus eq 'INPROGRESS' ? i18n['e-contract.dt.waiting.inprogress'] : item.eContract.eContractStatus}" />
                </p:column>

                <p:column styleClass="center-column">
                    <p:commandButton
                        process="@this"
                        icon="ui-icon-search"
                        value="#{i18n['e-contract.dt.waiting.see.detail']}"
                        action="#{myEctrInboxBB.openSelectedJob(item)}" />
                </p:column>

            </p:dataTable>

    </div>
</h:form>

带有rowSelect的xhtml页面

<?xml version="1.0"?>
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:pe="http://primefaces.org/ui/extensions">

<h:form
    id="eContractWaitingApprovalForm"
    prependId="false"
    enctype="multipart/form-data">

    <p:messages id="topmsgForEcontractWaitingApproval" />

    <div class="ui-grid ui-grid-responsive">
            <p:dataTable
                id="waitingEcontracts"
                widgetVar="waitingEcontracts"
                styleClass="grid-sm-bottom"
                rows="20"
                resizableColumns="true"
                resizeMode="expand"
                paginator="true"
                lazy="true"
                paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                rowsPerPageTemplate="5,10,15,50,100,200"
                value="#{myEctrInboxBB.lazyEcontractInboxItem}"
                var="item"
                selection="#{myEctrInboxBB.selectedInboxRow}"
                selectionMode="single"
                rowKey="#{item.processInstanceId}">

                <p:ajax event="rowSelect" listener="#{myEctrInboxBB.onRowSelect}"/>

                <p:column
                    styleClass="center-column"
                    headerText="#{i18n['e-contract.dt.waiting.agreement.no']}">
                    <h:outputText value="#{item.eContract.eContractCode}" />
                </p:column>

                <p:column
                    styleClass="center-column"
                    headerText="#{i18n['e-contract.dt.waiting.agreement.subject']}">
                    <h:outputText value="#{item.eContract.eContractSubject}" />
                </p:column>

                <p:column
                    styleClass="center-column"
                    headerText="#{i18n['e-contract.dt.waiting.agreement.date']}">
                    <h:outputText value="#{item.eContract.eContractDate}">
                        <f:convertDateTime
                            type="date"
                            pattern="dd-MM-yyyy" />
                    </h:outputText>
                </p:column>

                <p:column
                    styleClass="center-column"
                    headerText="#{i18n['e-contract.dt.waiting.agency.name']}">
                    <h:outputText value="#{item.agencyName}" />
                </p:column>

                <p:column
                    styleClass="center-column"
                    headerText="#{i18n['e-contract.dt.waiting.agency.type']}">
                    <h:outputText value="#{item.agencyType}" />
                </p:column>

                <p:column
                    styleClass="center-column"
                    headerText="#{i18n['e-contract.dt.waiting.agency.sales.manager']}">
                    <h:outputText
                        value="#{myEctrInboxBB.findSalesOfficeBySmCode(item.agencySM)}" />
                </p:column>

                <p:column
                    styleClass="center-column"
                    headerText="#{i18n['e-contract.dt.waiting.agreement.status']}">
                    <h:outputText
                        value="#{item.eContract.eContractStatus eq 'INPROGRESS' ? i18n['e-contract.dt.waiting.inprogress'] : item.eContract.eContractStatus}" />
                </p:column>

            </p:dataTable>

    </div>
</h:form>

当我点击一行Datatable时,selectEvent.getObject() - &gt; NULL始终使用LazyDataModel。

一个重要的重要信息:这些情况都发生在 WebLogic 10.3.6.0 中,并且像魅力一样在TomCat上运行(即使使用LazyDataModel)。

我的开发环境: JSF 2.0,Primefaces 5.2,带有TomCat 7.04的Liferay 6.2.3 ga4。 测试环境:除WebLogic 10.3.6.0以外的所有内容(仅在此处出现问题)

如果有人能帮助我,我真的很感激...提前致谢!!!

修改

@ManagedBean (name = "myEctrInboxBB")
@ViewScoped
public class MyEContractInboxBackingBean implements Serializable {

private static final long serialVersionUID = 2399679621562918360L;

private static final Logger logger = LogManager.getLogger(MyEContractInboxBackingBean.class);

@ManagedProperty("#{ectrDomainService}")
private transient EContractDomainService ectrDomainService;

@ManagedProperty("#{eContractUtil}")
private EContractUtilBean eContractUtil;

@ManagedProperty("#{ectrApproveController}")
private EContractApproveControllerBean ectrApproveController;

private EContractInboxItem selectedInboxRow;
private LazyEContractInboxItemModel lazyEcontractInboxItem;


@PostConstruct
public void init() {

    User portalUser = getUser();
    List<String> userRoles = fetchUserRoles(portalUser);
    List<String> userSmCodes = fetchUserSmCodes(userRoles, portalUser);

    lazyEcontractInboxItem = new LazyEContractInboxItemModel(userRoles, userSmCodes);
}

我们可以像这样访问Spring Beans:

    public EContractProcessService geteContractProcessService() {
    ELContext elContext = FacesContext.getCurrentInstance().getELContext();
    return (EContractProcessService) FacesContext.getCurrentInstance().getApplication()
        .getELResolver().getValue(elContext, null, "eContractProcessService");
}

0 个答案:

没有答案