f:从地图馈送时,selectItem的键和值被反转

com*_*e N 6 dictionary selectonemenu jsf-2

在JSF的标签中,如果你用它来提供它 Map<Key, Value>

<h:selectOneMenu value="#{bean.integerProperty}">
  <f:selectItems value="#{bean.mapProperty}"/>
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

生成的HTML将与人们期望的相反

<select>
  <option selected="selected" value="MapValue1">MapKey1</option>
  <option value="MapValue2">MapKey2</option>
  <option value="MapValue3">MapKey3</option>
</select>
Run Code Online (Sandbox Code Playgroud)

在某种意义上,地图的值将在选项的值属性中设置,并且键将在其标签中设置.

我找到了这个JIRA JIRA 1808,其中解释了必须编写错误地图的含义(主要是唯一性),但不太明白为什么要纠正这个问题.

'破坏性和向后不兼容'.

这是来自以前版本的JSF吗?如果是这样,是否有人知道它是否有这样的理由?

只是好奇是否有解释不解决这个问题.

Bal*_*usC 11

最初的推理毕竟相当简单:下拉标签的优先级高于下拉值.两个相同标签的下拉列表更像是"wtf?" 对于最终用户而不是具有两个相同值的下拉列表.地图键确保唯一性.我确实曾在你自己联系的问题报告中报告了技术不直观.但是,这是一个WONTFIX.如果它在JSF 2.2中被更改,它将不再向后兼容JSF 2.0/2.1.

如果您的环境支持EL 2.2(Tomcat 7,Glassfish 3等),您可以轻松地交换它,如下所示:

<h:selectOneMenu value="#{bean.integerProperty}">
  <f:selectItems value="#{bean.mapProperty.entrySet()}" var="entry" 
     itemValue="#{entry.key}" itemLabel="#{entry.value}" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

也可以看看: