2011-07-07 69 views
1

它加載stateList很好,但是當我改變狀態的值時,它調用backbean,但是addressBO爲空。 我該如何解決它?任何其他方式來做到這一點?f:ValueChangeListener無效EJB注入

在此先感謝。

<h:selectOneMenu id="stateList" value="#{newUserController.address.stateID}"> 
<f:selectItems value="#{addressController.stateList}" /> 
<f:valueChangeListener type="controller.address.AddressController"/> 
<f:ajax event="change" render="cidadeList"/> 
</h:selectOneMenu> 

<h:selectOneMenu id="cityList" value="#{newUserController.address.cityID}"> 
<f:selectItems value="#{addressController.cityList}" /> 
</h:selectOneMenu> 

BackBean

package controller.address; 

@ManagedBean 
@RequestScoped 
public class AddressController implements ValueChangeListener { 

@EJB 
private AddressBO addressBO; 

@PostConstruct 
public void firstThingToDo() { 
    stateList = enderecoBO.loadStateListSelectItem(); 
} 

@Override 
public void processValueChange(ValueChangeEvent event) throws AbortProcessingException { 
    String state = (String) event.getNewValue(); 
    cityList = addressBO.loadCityList(state); 
} 

} 

這集的未在這種情況下出現的地址和用戶價值的其他backbean。

package controller.user; 

@ManagedBean 
@RequestScoped 
public class NewUserController { 

private Address address; 
private User user; 

@EJB 
private NewUserBO newUserBO; 

public void registerNewUser() { 
    newUserBO.register(user, address); 
} 

public Address getAddress() { 
    return this.address; 
} 

public void setAddress(Address address) { 
    this.address = address; 
} 

public User getUser() { 
    return this.user; 
} 

public void setUser(User user) { 
    this.user = user; 
} 

} 
+0

您的視圖代碼不符合您的Bean代碼,因此你的問題/問題是非常混亂。請修正它(PS:請儘量在代碼中使用英文,不僅在這裏,而且在您的真實代碼中,這會極大地提高您的英語水平,並且非常有利於我們,SO-pedians和您的未來代碼維護人員)。到目前爲止,我只能說:你根本不需要'ValueChangeListener'。你對舊價值不感興趣。 – BalusC

+0

城市列表將根據州的價值加載。我已經知道英語了,但仍然有寫我想要的東西的一些問題。技術英語對我來說並不容易。我們仍然在考慮將代碼翻譯成英文,但只有巴西人編碼。當我們有時間時,我們會將其改進爲英語。現在沒有時間了:( – pringlesinn

+0

我不需要舊值,但是,如果不是'ValueChangeListener',我該怎麼做呢? – pringlesinn

回答

1

第一個問題是您要在<f:valueChangeListener>標記中創建類的全新實例。這是而不是@ManagedBean引用的實例相同,並且託管bean相關注釋也不會被調用。您寧可在<h:selectOneMenu>上使用valueChangeListener="#{addressController.processValueChange}"。但這並不能立即解決所有問題。第二個列表的行爲不像預期的那樣變化很大。

第二個問題是在驗證階段期間調用了值更改偵聽器方法。這是更改/加載模型值的錯誤時刻。您應該在調用動作階段執行此操作。使用<f:ajax>listener屬性。

所以:

<h:selectOneMenu id="stateList" value="#{newUserController.address.stateID}"> 
    <f:selectItems value="#{addressController.stateList}" /> 
    <f:ajax listener="#{addressController.changeState}" render="cidadeList" /> 
</h:selectOneMenu> 

@ManagedBean 
@RequestScoped 
public class AddressController { 

    @EJB 
    private AddressBO addressBO; 

    @PostConstruct 
    public void init() { 
     stateList = enderecoBO.loadStateListSelectItem(); 
    } 

    public void changeState(AjaxBehaviorEvent event) { 
     String state = (String) ((UIInput) event.getComponent()).getValue(); 
     cityList = addressBO.loadCityList(state); 
    } 

    // ... 
} 
+0

我會完成我正在做的事情,很快就會嘗試!謝謝! !! – pringlesinn

+0

完美!這就是我需要的! – pringlesinn

+0

不客氣。 – BalusC