我遇到了primefaces ajax調用監聽器的問題。 (primefaces 4.0,JSF 2.0,JBoss的6.1.1)selectOneMenu上的Primefaces監聽器
這是我所定義的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方法是沒有執行,因爲我沒有在日誌中看到「偵聽器執行」。
我試圖將託管bean從@ViewedScoped更改爲@RequestScoped用於調試目的,並且似乎selectOneMenu的更改觸發了一個事件,因爲每次修改菜單選擇時我都可以在日誌中看到「init已執行」 (重新創建ManagedBean來管理事件),但是我沒有在日誌中看到「偵聽器已執行」,因此偵聽器方法未執行。沒有例外被拋出。 任何想法解決?
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>
你有沒有試過'public void systemChangeListener(AjaxBehaviorEvent event)'? – rion18
我試過了但它不起作用:( – user2572526
我相信你不需要在偵聽器上的進程和事件屬性 - 只需刪除它們。什麼類型是selectedSystem和systemsList? –