2012-05-28 54 views
0

我希望根據選擇的dropdownlist項目來檢索List。對於我使用下面的代碼是不工作:PrimeFaces 3.2 selsectOneMenu valueChangeListener不起作用

<p:selectOneMenu style="width: 150px" value="#{watchBean.exchange}"> 
       <f:selectItem itemLabel="NSE" itemValue="nse"/> 
       <f:selectItem itemLabel="BSE" itemValue="bse"/>    
       <p:ajax event="change" update=":frm" listener="#{watchBean.doScripList}" /> 
      </p:selectOneMenu> 

bean代碼:

public void doScripList(ValueChangeEvent e) 
{ 

    sl=getAllScripByExchange((String)e.getNewValue()); //sl is of type List<MasterScrip> 
} 

當我調試,我看到該事件不會觸發和我得到以下錯誤:

javax.el.MethodNotFoundException: Method not found: [email protected](javax.faces.event.AjaxBehaviorEvent) 
at com.sun.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:155)... 

當我省略p:ajax'exchange'類型也沒有獲得/設置 是什麼導致了這個問題?它的解決方案是什麼?

編輯 更名方法哇()仍然是相同的錯誤:

javax.el.MethodNotFoundException: Method not found: [email protected](javax.faces.event.AjaxBehaviorEvent) 

編輯:託管bean代碼

import java.util.List; 
import javax.inject.Named; 
import javax.enterprise.context.RequestScoped; 
import javax.faces.context.FacesContext; 
import javax.faces.event.ValueChangeEvent; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpSession; 
import javax.xml.ws.WebServiceRef; 
import service.MasterScrip; 
import service.StatelessWebService_Service; 
@Named(value = "watchBean") 
@RequestScoped 
public class watchBean { 
    @WebServiceRef(wsdlLocation = "WEB-INF/wsdl/localhost_8080/StatelessWebService/StatelessWebService.wsdl") 
    private StatelessWebService_Service service; 

    /** Creates a new instance of watchBean */ 
    public watchBean() { 
    } 
    String uname,scripSym,exchange; 
    Integer scripID; 
    List<UserTrack> ut; 
List<MasterScrip> sl; 
    public List<MasterScrip> getSl() { 
     return sl; 
    } 

    public void setSl(List<MasterScrip> sl) { 
     this.sl = sl; 
    } 


    public String getExchange() { 
     return exchange; 
    } 

    public void setExchange(String exchange) { 
     sl=getAllScripByExchange(exchange); 
     this.exchange = exchange; 
    } 
public void wow(ValueChangeEvent e) 
{  
    sl=getAllScripByExchange((String)e.getNewValue()); 
    // setSl(sl); 
    //FacesContext.getCurrentInstance().renderResponse(); 

    // sl=getAllScripByExchange(exchange); 
} 
+0

爲健全檢查:嘗試重命名你的'doScripList'變成類似'哇'的東西,並用' Daniel

+0

由@Sai Ye Yan Naing Aye在下面給出,它說它是在primefaces 3.2中的一個bug。這是真的嗎?或者我應該與你的解決方案? – z22

+0

我不會指望「它的錯誤」沒有鏈接到開放問題+他給出的解決方案是從JSF 1 ... – Daniel

回答

1

嘗試改變

<p:ajax event="change" update=":frm" listener="#{watchBean.doScripList}" /> 

<p:ajax event="change" update=":frm" listener="#{watchBean.doScripList()}" /> 

在該方法的末尾添加括號。

JSF正在尋找支持bean中的方法setDoScripList,但在最後添加括號時,您明確地調用了此方法doScripList

+0

did所以仍然不工作 – z22

0

這是primefaces 3.2錯誤,請替換您的代碼,如下所示。

<h:selectOneMenu style="width: 150px" value="#{watchBean.exchange}" valueChangeListener="#{watchBean.doScripList}" onchange="submit()"> 
     <f:selectItem itemLabel="NSE" itemValue="nse"/> 
     <f:selectItem itemLabel="BSE" itemValue="bse"/>    
    </h:selectOneMenu> 

改變你的方法喜歡這裏;

public void doScripList(ValueChangeEvent e){ 
    sl = getAllScripByExchange((String)e.getNewValue()); 
    setAllScriptExchange(sl); //please write setAllScriptExchange method yourself 
    FacesContext.getCurrentInstance().renderResponse(); 
    } 

由於onchange事件,您的頁面被重新加載。

+0

這樣做,現在該方法被調用,但頁面重新加載,我不知道爲什麼,並且列表變量再次設置爲空 – z22

+0

看到我的新編輯的答案。 –

+0

我正在按照你的解決方案級聯droprown n,第二下拉它的填充意味着列表再次設置爲空,我猜,該怎麼辦? – z22

1

落在了同樣的問題,是你的,但我想通了,在valueChangeListener

public void doScripList(ValueChangeEvent e) 

作品只有當你使用<f:ajax>標籤,而不是當您使用<p:ajax>。 但由於selectOneMenu是<p:selectOneMenu>類型,所以<f:ajax>將不起作用。

我的工作是通過刪除參數ValueChangeEvent e,它的工作。 因此,在<p:ajax>標記的情況下嘗試使用無參數偵聽器。

public void doScripList() 
{ 
    sl=getAllScripByExchange(getExchangeName()); 
} 

注:在這裏,你不必事件參數的話,它會通過調用相應的setter方法設置新值,並且可以在聽者訪問更新的值。 對於這種情況,你還需要提供身份證到selectOneMenu用於這樣的:

<p:selectOneMenu id="exchangeName" style="width: 150px" value="#{watchBean.exchange}"> 
    ... 
</p:selectOneMenu> 

,然後添加了exchangeName get和set方法在Bean類:

private String exchangeName; 

public String getExchangeName(){ 
    return exchangeName; 
} 

public void setExchangeName(String exchangeName) { 
    this.exchangeName = exchangeName; 
}