在selectOneMenu上使用Primefaces监听器

时间:2014-07-02 11:40:05

标签: ajax jsf jsf-2 primefaces jboss

我在使用primefaces ajax调用侦听器时出现问题。 (primefaces 4.0,JSF 2.0,JBoss 6.1.1)

这是我定义的selectOneMenu:

<p:selectOneMenu id="sistema" label="Sistema" value="#{searchSchedulingBean.selectedSystem}">
    <p:ajax listener="#{searchSchedulingBean.systemChangeListener}" 
        process="@this"
        event="change"
        update="autostrada"/>
    <f:selectItems value="#{searchSchedulingBean.systemsList}" />
</p:selectOneMenu>

这是我的managedBean的主要部分

@ManagedBean
@ViewScoped
public class SearchSchedulingBean implements Serializable {
    ...
    @PostConstruct
    public void init() {
        logger.info("init executed");
        ...
    }

    public void systemChangeListener() {
        logger.info("listener executed");
        ...
    }

当我打开页面时,日志告诉我init方法已执行并且selectOneMenus已正确填充,因此我假设托管bean正在运行。 如果我更改了上面写的selectOneMenu,那么我要修改的selectOneMenu会受到影响,因为它是页面中唯一选择列表初始值的selectOneMenu,但是条目没有按照我的意愿更新,方法systemChangeListener不是执行是因为我没有看到&#34;听众被执行&#34;在日志中。

我尝试将托管bean从@ViewedScoped更改为@RequestScoped用于调试目的,似乎selectOneMenu的更改触发了一个事件,因为我可以在日志中看到&#34; init已执行&#34;每次我修改菜单选择(重新创建ManagedBean来管理事件)但我没有看到日志&#34;听众执行&#34;所以不执行监听器方法。没有异常被抛出。 有什么想法要解决吗?

EDIT1: 我尝试了你的建议,但它仍然无法正常工作。 我使用@ManagedBean @RequestScoped作为托管bean类注释,从日志中我可以看到每次selectonemenu更改但未执行侦听器方法时都会启动托管bean。 它可能是JBoss 6.1.1(Jsf 2.0)和Primefaces 4.0之间的兼容性问题吗? 如果是,建议JBoss 6.1.1使用哪个版本的primefaces? 是否需要使用primefaces进行特定配置? 为了完整性,我在这里写了部署描述符

的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0"
         metadata-complete="false"> 
    <context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>programmazioni.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

的JBoss-web.xml中

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
    <context-root>/PresentationModule</context-root>
</jboss-web>

这些是我在pom.xml中导入的依赖项

<dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.3-1101-jdbc4</version>
        </dependency>
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>4.0</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.7</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.7</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
            <scope>provided</scope>
        </dependency>

3 个答案:

答案 0 :(得分:0)

解决方案1:

替换

<p:ajax listener="#{searchSchedulingBean.systemChangeListener}" 

通过

<p:ajax listener="#{searchSchedulingBean.systemChangeListener()}" 

解决方案2:

替换

systemChangeListener()

通过

systemChangeListener(AjaxBehaviorEvent evt)

答案 1 :(得分:0)

试试这个。这对我有用

<p:ajax listener="#{searchSchedulingBean.systemChangeListener}" update="autostrada"/>

答案 2 :(得分:0)

我刚刚解决了,问题是由selectOneMenu的属性值引起的,该属性值必须是String类型,但在我的ManagedBean中我设置为SelectItem类型。