2012-02-05 33 views
10

Tôi gặp sự cố khi sử dụng thành phần tổng hợp JSF đúng cách. Tôi đặt một số thành phần với nhau và mọi thứ đều hoạt động. Sau đó, tôi chỉ trích xuất mã thành một thành phần tổng hợp và chuyển các thuộc tính tương ứng và đột nhiên tôi nhận được ngoại lệ cuộc hội thoại.Cách chuyển thuộc tính cho thành phần hỗn hợp

<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> 

Đây là trang mà tôi đang sử dụng các thành phần mới được tạo ra

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

Bean (một số phương pháp bỏ qua một phần đổi tên)

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)); 
     } 
    } 
.... 

} 

Exception

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 

Điều duy nhất thay đổi là tôi đang sử dụng bố cục thay vì mã đơn giản. Các biểu thức EL vẫn như cũ. Ai đó có thể khai sáng cho tôi được không? Tôi hy vọng rằng các thông số được thông qua nhưng rõ ràng là không ...

+0

Tôi nghĩ rằng bạn sẽ cần phải đăng getter cho thuộc tính bean selectedIds. – AlanObject

+0

Tôi đã thêm đậu vào câu hỏi – lostiniceland

Trả lời

11

Điều này liên quan đến Mojarra issue 2047. Nó dự kiến ​​sẽ được sửa trong 2.2 sắp tới.

Vé vấn đề cũng đề xuất các cách giải quyết như sau:

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

với trong giao diện CC

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

và trong việc thực hiện CC

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

Xin chào. Các tài sản trong đậu là một Set (tư nhân Set selectedIds;) với getter và setter. Như đã đề cập, mọi thứ đã hoạt động mà không cần giải nén vào thành phần hỗn hợp. Khi sử dụng phiên bản xhtml đơn giản và tất cả mọi thứ giống hệt nhau đều hoạt động như mong đợi. – lostiniceland

+0

Hmm, bạn đang sử dụng phiên bản/phiên bản JSF nào? – BalusC

+0

JBoss 7.1 CR1 sử dụng Mojarra (jsf-impl có phiên bản 2.1.5 trong thư mục mô-đun) – lostiniceland

Các vấn đề liên quan