【问题标题】:JSF 2.0 Ajax listener in SelectOneMenu tag is not workingSelectOneMenu 标记中的 JSF 2.0 Ajax 侦听器不起作用
【发布时间】:2011-11-03 18:28:18
【问题描述】:

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

【问题讨论】:

    标签: ajax jakarta-ee jsf-2


    【解决方案1】:

    现在,当我从 selectOneMenu 中选择一个值时,会触发一个 HTTP Post。我知道这一点是因为我的 PostConstruct 方法被调用并且消息在我的控制台中弹出。

    此时触发会话范围 bean 的 @PostConstruct 是不正常的。每当您在会话中第一次请求视图时,它应该只在 bean 的构造期间触发一次。你确定@SessionScopedjavax.faces.bean.SessionScoped 类型,因此不是 javax.enterprise.context.SessionScoped

    更新:根据 cmets,该问题已得到修复。但是,它并没有解决监听器未被调用的具体问题。事实证明发生了验证错误。如果在应用请求值阶段,所选项目的 equals() 方法没有为列表中的任何项目返回 true,则可能会发生这种情况。您可以通过提供一个

    <h:messages id="messages" />
    

    并将其 ID 包含在 render 属性中

    <f:ajax render="locationSelector messages" ... /> 
    

    与具体问题无关@ViewScoped 是一个更好的选择。这样,同一浏览器会话中的每个浏览器窗口/选项卡都有自己的 bean 实例。限定 bean 的会话即在同一会话内的所有浏览器窗口/选项卡之间共享,这可能导致“wtf?”因此对用户体验不利的行为。

    【讨论】:

    • 嘿,谢谢你的提示,导入确实是错误的。 INIT 现在被调用一次,但监听器仍然没有工作:(
    • 确保你有一个&lt;h:head&gt;(我认为你有一个 POST 似乎被解雇了)并且你没有相互嵌套多个&lt;h:form&gt;s(行为未指定和浏览器依赖)。
    • 是的,没关系,我用primefaces ajax标签试过了,还是不行:(。我得到的结果是:]] >{"validationFailed":true }
    • "validationFailed":true 提示验证失败。将&lt;h:messages id="messages" /&gt; 添加到视图并将id 添加到&lt;f:ajax&gt;render 属性。您看到Validation error: Value Not Valid 的巨大变化。这已经在 SO 上详细回答了无数次了 :)
    • 啊哈,这就是您显示验证消息的方式谢谢。有一个转换器问题:)
    猜你喜欢
    • 2014-09-10
    • 2014-01-28
    • 2015-11-24
    • 2011-05-02
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    相关资源
    最近更新 更多