2011-07-07 1 views
1

stateListファインをロードしますが、状態値を変更するとバックビーンが呼び出されますが、addressBOはnullです。 どうすれば修正できますか?他の方法でそれを行うには?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); 
} 

} 

この場合には表示されないアドレスとユーザーの値のset他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}"を使用することをお勧めします。しかし、それはすぐにすべてを解決するわけではありません。この変更は、2番目のリストが期待通りに動作しないほど大きくなります。

第2の問題は、値変更リスナーメソッドが検証中に呼び出され、フェーズです。これは、モデル値を変更/ロードする間違った瞬間です。 呼び出しアクションフェーズでこれを行う必要があります。 listenerという属性を<f:ajax>としてください。だから、

<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

関連する問題