问题已解决!! 我的支持bean上有一个验证错误,告诉我这样的事情: 'null Converter'的转换错误设置值'Africa(AFR)'。
由于JSF生命周期,我的backingbean上的监听器方法未被调用
我遇到了JSF2的问题。 我有一个带有ajax标记的selectOneMenu标记,它应该在更改其值时触发监听器。 xhtml页面如下所示(删除了一些内容)
<h:selectOneMenu id="selectedContinent" value="#{searchExtendedAction.destination.continent}">
<f:selectItems value="#{searchExtendedAction.continents}" />
<f:ajax render="locationSelector" listener="#{searchExtendedAction.doUpdateLocations}" />
</h:selectOneMenu>
在我的支持bean中,我有以下内容(保留一些属性):
@ManagedBean
@SessionScoped
public class SearchExtendedAction implements Serializable{
// Left some properties out
@Valid
private Location departure;
@PostConstruct
public void init(){
System.err.println("INIT called");
allContinents = continentService.getAllContinents();
}
@EJB
private ContinentService continentService;
public void doExtendedSearch()
{
System.err.println("SEARCH");
}
public void doUpdateLocations(AjaxBehaviorEvent event)
{
System.err.println("BONZAI");
}
public List<SelectItem> getContinents()
{
List<SelectItem> continents= new ArrayList<SelectItem>();
continents.add(new SelectItem("--- Select Continent ---"));
for(Continent c : continentService.getAllContinents()){
continents.add(new SelectItem(c.getName()));
}
return continents;
}
}
现在,当我从selectOneMenu中选择一个值时,会触发HTTP Post。我知道这是因为调用了PostConstruct方法并且在我的控制台中弹出了消息。但听众并没有被召唤。我不明白为什么。
有关我正在使用的技术的更多信息:
16:21:08,282 INFO [AbstractServer] Starting: JBossAS [6.1.0.Final "Neo"]
16:21:11,725 INFO [ServerInfo] Java version: 1.7.0,Oracle Corporation
16:21:11,725 INFO [ServerInfo] Java Runtime: Java(TM) SE Runtime Environment (build 1.7.0-b147)
16:21:11,725 INFO [ServerInfo] Java VM: Java HotSpot(TM) 64-Bit Server VM 21.0-b17,Oracle Corporation
16:21:11,726 INFO [ServerInfo] OS-System: Windows 7 6.1,amd64
16:21:19,067 INFO [AbstractServerConfig] JBoss Web Services - Stack CXF Server 3.4.1.GA
16:21:19,981 INFO [JSFImplManagementDeployer] Initialized 3 JSF configurations: [Mojarra-1.2, MyFaces-2.0, Mojarra-2.0]
答案 0 :(得分:2)
现在,当我从selectOneMenu中选择一个值时,会触发HTTP Post。我知道这是因为调用了我的PostConstruct方法,并且在我的控制台中弹出了消息。
此时触发会话范围bean的@PostConstruct
是不正常的。每当您在会话中第一次请求视图时,它应该在bean构造期间仅触发一次。您确定@SessionScoped
的类型为javax.faces.bean.SessionScoped
,因此不是 javax.enterprise.context.SessionScoped
吗?
更新:根据评论,该问题已修复。但是,它没有解决未被调用的侦听器的具体问题。事实证明发生了验证错误。如果所选项目的equals()
方法在应用请求值阶段期间未对列表中的任何项目返回true
,则会发生这种情况。您可以通过提供
<h:messages id="messages" />
并将其ID包含在render
属性
<f:ajax render="locationSelector messages" ... />
无关,@ViewScoped
是更好的选择。这样,同一浏览器会话中的每个浏览器窗口/选项卡都有自己的bean实例。一个限定bean的会话即在同一会话中的所有浏览器窗口/选项卡之间共享,这可能导致“wtf?”因此对用户体验不利的行为。