f: ключ и значение selectItem инвертируются при подаче с карты - PullRequest
6 голосов
/ 27 марта 2012

В теге 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 JIRA 1808 , где объясняются последствия необходимости писать неправильные карты (в основном уникальность), но я не совсем понимаю, почему исправление будет

«разрушительный и обратно несовместимый».

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

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

1 Ответ

10 голосов
/ 27 марта 2012

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

См. также:

...