gpt4 book ai didi

java - 将参数从一个页面传递到另一页面 - 表达式引用的对象的范围比引用的托管 bean 错误短

转载 作者:行者123 更新时间:2023-12-01 13:02:06 25 4
gpt4 key购买 nike

我试图将参数从一个页面传递到另一个页面,但是当我按下“详细信息”按钮时,它给出了此错误:“无法创建托管 bean AgencyDetailBean。发现了以下问题: - 的范围表达式 #{agency} 引用的对象,请求,比 session 的引用托管 bean (agencyDetailBean) 范围短”

这是我的 .xhtml 页面的一部分:

<p:dataGrid var="agency" value="#{agencyBean.agencyList}" columns="1"
rows="5" paginator="true" paginatorPosition="bottom">
<p:growl id="growl" showDetail="true" />
<p:fieldset legend="${agency.tUser.name}" toggleable="true">
<p:ajax event="toggle" listener="#{fieldsetBean.handleToggle}"
update="growl" />
<h:panelGrid columns="2" cellpadding="3" cellspacing="1">
<h:panelGrid columns="2" cellpadding="3" cellspacing="1">
Name: <h:outputText value="${agency.tUser.name}" />
Phone: <h:outputText value="${agency.tUser.phone}" />
</h:panelGrid>

<h:commandButton value="Details" action="agencyDetail">
<f:setPropertyActionListener target="#{agencyBean.tAgency}"
value="${agency}" />
</h:commandButton>
</h:panelGrid>

</p:fieldset>
</p:dataGrid>

我的第一个 bean :

@ManagedBean(name = "agencyBean")
@SessionScoped
public class AgencyBean implements Serializable {

private TAgency tAgency = new TAgency();
private List<TAgency> agencyList;

public List<TAgency> getAgencyList() {
return agencyList;
}

public void setAgencyList(List<TAgency> agencyList) {
this.agencyList = agencyList;
}

@PostConstruct
public void init() {
EntityManager em = HibernateUtil.getEntityManager();
Query q = em.createQuery("select u from TAgency u");
agencyList = q.getResultList();
}

public TAgency gettAgency() {
return tAgency;
}

public void settAgency(TAgency tAgency) {
this.tAgency = tAgency;
}
}

我的第二个bean类:

@ManagedBean(name = "agencyDetailBean", eager = true)
@SessionScoped
public class AgencyDetailBean implements Serializable {
private static final long serialVersionUID = 1L;

@ManagedProperty(value = "#{tAgency}")
private AgencyBean agencyBean;

private TAgency tAgency;

public TAgency gettAgency() {
if (agencyBean != null) {
tAgency = agencyBean.gettAgency();
}
return tAgency;
}

public void setAgencyBean(AgencyBean agency) {
this.agencyBean = agency;
}
}

最初,.xhml 页面是这样的并且可以正常工作。

<p:growl id="growl" showDetail="true" />
<c:forEach items="#{agencyBean.agencyList}" var="agency">
<p:fieldset legend="${agency.tUser.name}" toggleable="true">
...
<h:commandButton value="Details" action="agencyDetail">
<f:setPropertyActionListener target="#{agencyDetailBean.agency}"<br/>
value="${agency}" />
</h:commandButton>
</h:panelGrid>
</p:fieldset>
</c:forEach>

有什么建议吗?问题是什么以及如何解决?预先感谢!

最佳答案

使用@ManagedBean,您无法将较小范围的bean注入(inject)到较大范围的bean中。对于您的情况,将 @SessionScoped 注入(inject)到 @RequestScoped 中。然后,您可以从 @RequestScoped bean 更新 @SessionScoped 的任何属性。

关于您的更新,在第二个 bean 中,您无法从这样的 getter 获取 tAgency 。以下函数可以完成这项工作。

@PostConstruct
public void init() {
tAgency = agencyBean.gettAgency();
}

关于java - 将参数从一个页面传递到另一页面 - 表达式引用的对象的范围比引用的托管 bean 错误短,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23449253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com