Jsf 2 如何将属性传递给复合组件
我在以正确的方式使用JSF复合组件方面遇到了困难。我把一些部件组装在一起,一切正常。然后我将代码提取到一个复合组件中,并传递相应的属性,然后突然出现会话异常Jsf 2 如何将属性传递给复合组件,jsf-2,composite-component,Jsf 2,Composite Component,我在以正确的方式使用JSF复合组件方面遇到了困难。我把一些部件组装在一起,一切正常。然后我将代码提取到一个复合组件中,并传递相应的属性,然后突然出现会话异常 <composite:interface> <composite:attribute name="selectedIDs" type="java.util.Collection" required="true"/> <composite:attribute name="selectItems"
<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>
唯一改变的是我使用的是合成而不是普通代码。EL表达式仍然相同。有人能告诉我吗?我希望参数只是传递过来的,但显然不是…这与。它计划在即将到来的2.2中修复
发行票据还提出了以下解决方法:
<view:selectManyControlPanel
selectedIDsBean="#{bean}"
selectedIDsProperty="selectedIds"
我想您需要发布bean属性selectedds的getter。我将bean添加到问题hi中。bean中的属性是一个集合(私有集合selectedds;),带有getter和setter。如前所述,一切工作都没有提取到复合组件。当使用普通的xhtml版本和完全相同的bean时,一切都正常工作。嗯,您使用的是哪个JSF impl/版本?JBoss 7.1 CR1使用Mojarra(JSF impl在modules文件夹中有2.1.5版),我可以复制它。这似乎是一个已知的问题。我已经改变了答案。@BalusC在复合组件中使用它时,我们面临着同样的问题。单独使用时,它可以完美地工作。这应该在更新的固定版本中也可以使用?请让我知道。这会有很大的帮助。谢谢
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
<view:selectManyControlPanel
selectedIDsBean="#{bean}"
selectedIDsProperty="selectedIds"
<composite:attribute name="selectedIDsBean" required="true"/>
<composite:attribute name="selectedIDsProperty" required="true"/>
<h:selectManyListbox value="#{cc.attrs.selectedIDsBean[cc.attrs.selectedIDsProperty]}">