2013-05-15 40 views
0

我想用Map<String, List<Object>>为依托属性丰富:选择列表如下:地图为后盾,属性丰富:PICKLIST

 <ui:repeat value="#{bean.selectedMap.entrySet" var="entry"} > 
     <rich:pickList value="#{entry.value}" var="list" > 
      <f:selectItems value="#{bean.getAll}" /> 
      <f:converter converterId="myBeanConverter" /> 
     </rich:pickList> 
     </ui:repeat> 

支持bean:

public class MyBean { 
private Map<String, List<String>> myList; 
... 
getters/setters for myList 
} 

问题是我仍然得到这个例外:

15:19:16,583 SEVERE [info.fingo.salutor.exception.CustomExceptionHandler] (http--127.0.0.1-8080-4) Critical Exception!: javax.faces.FacesException: ModelType (class java.lang.Object) must be either an Array, or a Collection 
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:84) [jsf-impl-2.1.7-jbossorg-2.jar:] 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.7-jbossorg-2.jar:] 
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:] 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:] 

Caused by: javax.faces.FacesException: ModelType (class java.lang.Object) must be either an Array, or a Collection 
    at org.richfaces.renderkit.SelectManyHelper.getConvertedValue(SelectManyHelper.java:332) [richfaces-components-ui-4.2.2.Final.jar:4.2.2.Final] 
    at org.richfaces.renderkit.SelectManyRendererBase.getConvertedValue(SelectManyRendererBase.java:108) [richfaces-components-ui-4.2.2.Final.jar:4.2.2.Final] 
    at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at javax.faces.component.UIInput.validate(UIInput.java:960) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at javax.faces.component.UIInput.executeValidate(UIInput.java:1233) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at javax.faces.component.UIInput.processValidators(UIInput.java:698) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at com.sun.faces.facelets.component.UIRepeat.process(UIRepeat.java:532) [jsf-impl-2.1.7-jbossorg-2.jar:] 
    at com.sun.faces.facelets.component.UIRepeat.processValidators(UIRepeat.java:766) [jsf-impl-2.1.7-jbossorg-2.jar:] 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at javax.faces.component.UIForm.processValidators(UIForm.java:253) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76) [jsf-impl-2.1.7-jbossorg-2.jar:] 
    ... 39 more 

任何人都知道它是怎么回事?

回答

1

如果我们关注未能正确关闭EL表达式(}),问题是在地图实例上确实没有定义方法getEntrySet。因此,假设您的环境支持EL 2.2,只需将函数调用()放在EL表达式的末尾,就可以告诉EL它是一个方法调用。

接下来,<ui:repeat>目前不支持迭代一个Set,所以无论是创建一个帮助吸气,返回一个List,或者创建自定义EL函数,或者使用Set#toArray()方法。

例如,后者看起来像:#{bean.selectedMap.entrySet().toArray()}。对于另一种替代方案,请查看关于此主题的答案,以回答已在Stack Overflow中提出并回答的问题。

+0

事实上,我有一个工厂方法: @Factory(值= “entrySetList”,范围= ScopeType.EVENT,AUTOCREATE =真) \t公开名单<条目<字符串,字符串[] >> getEntrySetAsList(){。 ..} 返回列表而不是set。在重新输入真正的代码给有问题的代码时,表达式在这里并没有被我的错误所封闭。所以你提到的两个问题都不是重点。但是,但是,感谢您的考虑! –

+0

如果你实际上有一个'List',为什么你要求一个'Map'解决方案? – skuntsel

+0

我不确定我是否理解你的问题。我有一个地图条目列表。建模菜单(键)和分配给该菜单的页面列表需要使用地图。 –