SelectOneMenu标记中的JSF 2.0 Ajax侦听器无法正常工作

时间:2011-08-25 14:35:28

标签: ajax java-ee jsf-2

问题已解决!! 我的支持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]

1 个答案:

答案 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?”因此对用户体验不利的行为。