2014-07-02 106 views
0

我遇到了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> 
+0

你有沒有試過'public void systemChangeListener(AjaxBehaviorEvent event)'? – rion18

+0

我試過了但它不起作用:( – user2572526

+0

我相信你不需要在偵聽器上的進程和事件屬性 - 只需刪除它們。什麼類型是selectedSystem和systemsList? –

回答

0

解決方案1:

替換

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

通過

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

解決方案2:

替換

systemChangeListener() 

通過

systemChangeListener(AjaxBehaviorEvent evt) 
+0

不幸的是,在這種方式下它不 – user2572526

0

試試這個吧。這是爲我工作

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

感謝您的回覆,但不幸的是它仍然不適用於我 – user2572526

0

我剛剛解決,問題是由selectOneMenu用於的屬性值必須爲String類型的,但在我ManagedBean我設置好的作爲了SelectItem型引起的。

+0

下一次把整個代碼放在一起,但我懷疑這是唯一的問題,您已經改變了您的EL表達或方法簽名 –

+0

對不起,我試過只把我認爲重要的代碼放在過度充電的帖子中,但我犯了一個錯誤:( 它在p:ajax標籤「監聽器」屬性中沒有'()',並且沒有方法簽名參數 感謝您對我的問題感興趣,並再次抱歉,如果我沒有寫過f ull代碼。 – user2572526