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
相关产品推荐
相关产品推荐

