You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSF页面Ajax筛选后跳转无法绑定当前对象问题求助

问题:客户详情搜索区域筛选后始终返回第一条数据

问题现象

  • 未使用搜索区域筛选功能时:点击放大图标进入详情页,页面运行正常
  • 使用搜索区域筛选功能后:客户详情的搜索区域(下拉框)始终返回数据表格的第一条数据

相关代码片段

客户列表跳转详情相关代码

licenseholder.xhtml

<p:commandButton process="@this" 
                 title="Details" 
                 icon="fa button-icon-color icon-search"
                 action="#{licenseHolderAdmin.doShowDetails()}">
    <f:setPropertyActionListener value="#{serviceCustomer}" target="#{licenseHolderAdmin.holderCurrent}" />
    <f:setPropertyActionListener value="0" target="#{licenseHolderAdmin.activeTab}" />
</p:commandButton>

LicenseholderAdmin.java

public String doShowDetails() {
    if (updateCurrentHolder) {
        this.getHolderCurrent();
    }

    setSelectedLicenses(new ArrayList<License>());
    return "licenseholderdetails";
}


public LicenseHolder getHolderCurrent() {
    if (updateCurrentHolder) {
        if (holderCurrent != null
                && holderCurrent.getCustomerId() != null) {
            holderCurrent = customerDao.update(holderCurrent);
        }
        updateCurrentHolder = false;
    }
    return holderCurrent;
}

CustomerDao.java

@Override
public LicenseHolder findById(long id) {
    try {
        Query query = em.createQuery("select distinct lh from LicenseHolder lh where customerId = :id");
        Integer intId = (int) id;
        query.setParameter("id", intId);
        return (LicenseHolder) query.getSingleResult();
    } catch (Exception e) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Datensatz konnte nicht gefunden werden.", "ID=" + id));
        LOGGER.error("Error while retrieving single customer.");
        return null;
    }
}

public LicenseHolder update(LicenseHolder customer) {
    return findById(customer.getCustomerId());
}

客户详情页搜索区域相关代码

licenseholder-details.xhtml

<p:selectOneMenu class="dropdown"  value="#{licenseHolderAdmin.holderCurrent}"  converter="licenseHolderConverter" >

<f:selectItems value="#{licenseHolderAdmin.getServiceCustomers()}" var="customer"
itemLabel="#{customer.company} (#{customer.customberNumber})" itemValue="#{customer}" />
                                                         
<p:ajax event="change" oncomplete="switchToCustomer()" process="@form" />
</p:selectOneMenu>

LicenseholderAdmin.java

public List<LicenseHolder> getServiceCustomers() {
    return getHolders();
}

public List<LicenseHolder> getHolders() {
    if (holders == null || updateHolderList) {
        holders = customerDao.getAllCustomers();
        updateHolderList = false;
    }
    return holders;
}

CustomerDao.java

public List<LicenseHolder> getAllCustomers() {
    List<LicenseHolder> holders = null;

    try {
        Query query = em.createQuery("select distinct lh from LicenseHolder lh order by COMPANY");
        holders = query.getResultList();
    } catch (Exception e) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Datensätze konnte nicht geladen werden.", ""));
        LOGGER.error("Error while retrieving all customers.");
    }

    return holders;
}

已尝试的解决方案

  • 将<f:selectItems>的itemValue设为#{customer.customberNumber},问题未解决
  • 尝试将<f:selectItems>的value设为#{licenseHolderAdmin.getHolder(Long id)},但丢失下拉框的查询功能

本人对JSF不熟悉,恳请各位提供技术建议!


内容的提问来源于stack exchange,提问作者jinyao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:50:23