我正在使用Primefaces 5。
我想在选择时调用Listener,调用侦听器但返回null对象;
我的JSF页面中有以下内容
<ui:define name="page-content">
<h:form prependId="false">
<p:commandButton image="back" ajax="false" immediate="true" style="margin-right:20px;" value="#{phasemsgs['navigation.back']}" action="/boo/viewMesTaches.xhtml"/>
<p:panel header="#{phasemsgs['tache.title']} Details" style="margin-top:10px">
<p:messages />
<h:panelGrid id="detail" columns="2" styleClass="grid" columnClasses="label,value">
<h:outputText value="#{phasemsgs['tache.nomtache.title']}:" />
<h:inputText id="phase_nomtache" value="#{TacheComponent.tache.nomtache}" required="false" label="phase_nomtache" />
<h:outputText value="Projet :*" />
<h:selectOneMenu id="selectProjet"
value="#{ProjetComponent.projet.idprojet}" required="false">
<f:selectItem itemLabel="Select One" itemValue="" noSelectionOption="true" />
<f:selectItems value="#{ProjetComponent.listProjets()}"
var="projet" itemValue="#{projet.idprojet}"
itemLabel="#{projet.nomprojet}" />
<p:ajax listener="#{ProjetComponent.onProjetChange()}"
update="selectPhase" />
<f:converter converterId="entityConverter" />
</h:selectOneMenu>
<h:outputText value="Phase :*" />
<h:selectOneMenu id="selectPhase"
value="#{TacheComponent.tache.phase.idphase}" required="false">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{ProjetComponent.listPhases}" var="phase"
itemValue="#{phase}" itemLabel="#{phase.typephase}" />
<f:converter converterId="entityConverter" />
</h:selectOneMenu>
</h:panelGrid>
这是我的Component中的onProjetChange方法:
@Scope("session")
@Component("ProjetComponent")
public class ProjetComponentImpl implements ProjetComponent {
private Projet projet;
List<Phase> listPhases;
@Autowired
private ProjetDAO projetDAO;
getters and setters ..
public ProjetComponentImpl() {
}
@PostConstruct
public void init() {
//initialize the data here
this.projet=new Projet();
this.listPhases=new ArrayList<Phase>();
}
public void onProjetChange() {
if(projet !=null && !projet.equals(""))
{
listPhases = new ArrayList<Phase> (projet.getPhases());
System.out.println("onProjetChange Clause if:" + projet.getNomprojet());
}
else{
listPhases = new ArrayList<Phase>();
System.out.println("onprojetChange else:"+projet.getNomprojet());
}
这是堆栈跟踪:
onProjetChange Clause if:null
这是一个截图:
答案 0 :(得分:1)
如果我理解正确,我认为你必须直接绑定到bean上的实体,而不是它的id。所以,使用
<h:selectOneMenu id="selectProjet" value="#{ProjetComponent.projet}" required="false">
和
itemValue="#{projet}"
这样,实体转换器就能完成这项工作。
答案 1 :(得分:1)
正如@Jaqen H&#39; ghar所说,你没有为你的Bean设置一个Phase对象。
由于您提供了一个列表作为选择选项
<f:selectItems value="#{ProjetComponent.listPhases}" .../>
您应该将所选项目反馈给您的bean
<h:selectOneMenu value="#{TacheComponent.selectedPhase}" ..>
其中,你也应该在你的Bean中为selectedPhase设置一个get / set,名为&#39; TacheComponent&#39;
private Phase selectedPhase;
public Phase getSelectedPhase() {
return selectedPhase;
}
public void setSelectedPhase(Phase selectedPhase) {
this.selectedPhase = selectedPhase;
}
最后一点是,您的阶段类可能是 Pojo ,不是字符串对象,因此您无法将其与p一起使用:selectXYZ组件,不使用转换器。我怀疑这是尝试设置phase.idphase
(我也怀疑是String属性)的原因,然后你尝试使用转换器,但你可能没有设置正确。由于您没有为 entityConverter 提供代码,因此很难说出您做错了什么。
使用转换器是一项非常简单的工作。你真的需要花10分钟来了解它们是如何工作的,而且你很乐意去。有很多关于转换器的教程,例如你可以尝试this one