2012-02-05 13 views
10

JSFコンポジットコンポーネントを正しく使用する上で問題があります。私はいくつかのコンポーネントをまとめ、すべてが機能していました。次に、コンポジットコンポーネントにコードを抽出し、対応する属性を渡して突然会話の例外を取得しています。ここでコンポジットコンポーネントに属性を渡す方法

<composite:interface> 
    <composite:attribute name="selectedIDs" type="java.util.Collection" required="true"/> 
    <composite:attribute name="selectItems" type="java.util.List" required="true" />  
    <composite:attribute name="addAction" required="true"/> 
    <composite:attribute name="deleteAction" required="true"/> 
    <composite:attribute name="deleteButtonDisabled" /> 
    <composite:attribute name="ajaxListener" method-signature="void listener(javax.faces.event.AjaxBehaviorEvent)"/> 
</composite:interface> 
<composite:implementation> 
<div class="myClass"> 
    <h:outputStylesheet library="views" name="selectManyControlPanel.css" target="head" /> 

    <h:form> 
     <h:selectManyListbox value="#{cc.attrs.selectedIDs}"> 
      <f:selectItems value="#{cc.attrs.selectItems}" /> 
      <f:ajax render="delete" 
       listener="#{cc.attrs.ajaxListener}" /> 
     </h:selectManyListbox> 
     <br /> 
     <h:commandButton id="delete" value="Delete" 
      disabled="#{cc.attrs.deleteButtonDisabled}" 
      action="#{cc.attrs.deleteAction}" /> 
     <h:commandButton id="add" value="Add" action="#{cc.attrs.addAction}"/> 
    </h:form> 
</div> 
</composite:implementation> 

は、私が新たに作成されたコンポーネント

<view:selectManyControlPanel 
      selectedIDs="#{bean.selectedIds}" 
      selectItems="#{bean.listOfSelectItems}" 
      addAction="#{bean.addNew}" 
      deleteAction="#{bean.deleteSelection}" 
      ajaxListener="#{bean.selectionChanged}" 
      deleteButtonDisabled="#{bean.deleteButtonDisabled}" /> 

ビーン(いくつかのメソッドの名前が変更部分をスキップ)

package views; 

@SuppressWarnings("serial") 
@Named 
@RequestScoped 
public class Bean implements Serializable, IOverviewView { 

    @Inject 
    Presenter presenter; 
    private boolean deleteButtonDisabled; 

    private List<SelectItem> listOfSelectItems; 

    private Set<Long> selectedIds; 


    public Bean(){ 
     deleteButtonDisabled = true; 
     listOfSelectItems = new ArrayList<SelectItem>(10); 
    } 


    public void selectionChanged(AjaxBehaviorEvent event){ 
     if(selectedIds.isEmpty()) 
      deleteButtonDisabled = true; 
     else 
      deleteButtonDisabled = false; 
    } 

    public void deleteBikes(){ 
     presenter.delete(selectedIds); 
    } 

    public void addNew(){ 
     presenter.addNew(); 
    } 

    public List<SelectItem> getListOfSelectItems() { 
     return listOfSelectItems; 
    } 

    public Set<Long> getSelectedIds() { 
     return selectedIds; 
    }   

    @PostConstruct 
    public void init(){ 
     System.out.println("INITIALIZING BEAN: " + this.getClass().getName()); 
     this.presenter.setView(this); 
     this.presenter.init(); 
    } 

    public boolean isDeleteButtonDisabled() { 
     return deleteButtonDisabled; 
    } 

    @Override 
    public void setDeleteButtonEnabled(boolean isEnabled) { 
     deleteButtonDisabled = !isEnabled; 
    } 

    public void setListOfSelectItems(List<SelectItem> list) { 
     this.listOfSelectItems = list; 
    } 

    public void setSelectedIds(Set<Long> selectedIds) { 
     this.selectedIds = selectedIds; 
    } 


    @Override 
    public void updateBikesList(Set<ViewObject> objectsToDisplay) { 
     updateList(objectsToDisplay); 
    } 


    private void updateList(Set<ViewObject> objectsToDisplay){ 
     listOfSelectItems.clear(); 
     for (ViewObject vO : objectsToDisplay) { 
      final String label = vO.getManufacturer() + ", " + vO.getModel() + " (" + vO.getYear() + ")"; 
      listOfSelectItems.add(new SelectItem(vO.getId(), label)); 
     } 
    } 
.... 

} 

例外

javax.el.ELException: /resources/views/selectManyControlPanel.xhtml @25,56 value="#{cc.attrs.selectedIDs}": /index.xhtml @21,70 selectedIDs="#{bean.selectedIds}": Cannot convert [Ljava.lang.String;@1e92093 of type class [Ljava.lang.String; to interface java.util.Set 

を使用していますページですその唯一のこと私はプレーンコードの代わりにコンポジションを使用しています。 EL式はまだ同じです。誰かが私を啓発できますか?私は、パラメータがちょうど通過したが、明らかにそうではないことを期待しました...

+0

<view:selectManyControlPanel selectedIDsBean="#{bean}" selectedIDsProperty="selectedIds" 

を私はあなたが投稿する必要があるとしていると思いますBeanプロパティselectedIdsのゲッター。 – AlanObject

+0

私は質問 – lostiniceland

答えて

11

これはMojarra issue 2047に関連しています。これは、今後の2.2で修正される予定です。

問題チケットは、以下の回避策を提案している:CCインターフェイスで

<composite:attribute name="selectedIDsBean" required="true"/> 
<composite:attribute name="selectedIDsProperty" required="true"/> 

とCCの実装で

<h:selectManyListbox value="#{cc.attrs.selectedIDsBean[cc.attrs.selectedIDsProperty]}"> 
+0

にこんにちはを追加しました。 Beanのプロパティは、getterとsetterを持つSet(プライベートセット selectedIds;)です。前述のように、すべては複合コンポーネントに抽出せずに機能しました。プレーンなxhtmlバージョンとまったく同じbeanを使用すると、すべてが期待どおりに動作しています。 – lostiniceland

+0

ええと、どのJSF impl/versionを使用していますか? – BalusC

+0

JBoss 7.1 Mojarraを使用しているCR1(jsf-implはmodules-folderにバージョン2.1.5を持っています) – lostiniceland

関連する問題