f: ключ и значение selectItem перевернуты при подаче с карты

в теге JSF, если вы кормите его с помощью Map<Key, Value>

<h:selectOneMenu value="#{bean.integerProperty}">
  <f:selectItems value="#{bean.mapProperty}"/>
</h:selectOneMenu>

полученный HTML будет обратным тому, что можно было бы ожидать

<select>
  <option selected="selected" value="MapValue1">MapKey1</option>
  <option value="MapValue2">MapKey2</option>
  <option value="MapValue3">MapKey3</option>
</select>

в том смысле, что значение карты будет установлено в атрибуте значения опции, а ключ будет установлен в ее метке.

Я нашел эту Джиру JIRA 1808 где объясняются последствия необходимости писать неправильные карты (уникальность, в основном), но не совсем понимаю, почему исправление этого будь

'разрушительная и обратная несовместимость'.

это происходит из предыдущих версий JSF? Если да, то кто-нибудь знает, есть ли причина для этого?

просто интересно, есть ли объяснение, чтобы не исправить это.

1 ответов


начальное рассуждение в конце концов довольно просто: выпадающие метки имеют больший приоритет, чтобы быть уникальными, чем выпадающие значения. Выпадающий список с двумя одинаковыми метками будет больше "wtf?"для конечного пользователя, чем выпадающий список с двумя одинаковыми значениями. Ключи карты обеспечивают уникальность. Я действительно не сообщал о технических unintuitiveness в отчет о проблеме, которой был связан сам. Тем не менее, это 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>

Читайте также: