[
https://issues.apache.org/jira/browse/MYFACES-4560?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17688597#comment-17688597
]
Bernd Bohmann commented on MYFACES-4560:
----------------------------------------
I have a simple test to verify the wrong behavior
{code:java}
@Test
public void testSelectListAsValue()
{
List<SelectItem> values = new ArrayList<>();
values.add(new SelectItem("#1", "D1"));
values.add(new SelectItem("#2", "D2"));
values.add(new SelectItem("#3", "D3"));
UISelectItems selectItems = new UISelectItems();
selectItems.setValue(values);
selectItems.getAttributes().put("var", "item");
ValueExpression itemValue = new MockValueExpression("#{item.label}",
Object.class);
ValueExpression itemLabel = new MockValueExpression("#{item.key}",
Object.class);
ValueExpression itemDescription = new MockValueExpression("#{item.key}",
Object.class);
selectItems.setValueExpression("itemValue", itemValue);
selectItems.setValueExpression("itemLabel", itemLabel);
selectItems.setValueExpression("itemDescription", itemLabel);
UISelectOne selectOne = new UISelectOne();
selectOne.getChildren().add(selectItems);
SelectItemsIterator iter = new SelectItemsIterator(selectOne, facesContext);
List<String> options = new ArrayList<>();
List<String> labels = new ArrayList<>();
List<String> descriptions = new ArrayList<>();
while (iter.hasNext())
{
SelectItem next = iter.next();
options.add((String) next.getValue());
labels.add(next.getLabel());
descriptions.add(next.getDescription());
}
Assertions.assertAll(
() ->
Assertions.assertEquals(values.stream().map(SelectItem::getLabel).collect(Collectors.toList()),
options),
() ->
Assertions.assertEquals(values.stream().map(SelectItem::getValue).collect(Collectors.toList()),
labels),
() ->
Assertions.assertEquals(values.stream().map(SelectItem::getValue).collect(Collectors.toList()),
descriptions));
}{code}
> Faces Issue #1791 SelectItems rendering
> ---------------------------------------
>
> Key: MYFACES-4560
> URL: https://issues.apache.org/jira/browse/MYFACES-4560
> Project: MyFaces Core
> Issue Type: Improvement
> Affects Versions: 2.3.10, 2.3-next-M7, 3.0.2, 4.0.0-RC4
> Reporter: Melloware
> Priority: Major
>
> See; [https://github.com/jakartaee/faces/issues/1791]
>
> The component should render the itemLabel as instructed by the provided EL,
> even if the backed data type is SelectItem. The default rendering should only
> be done when the attribute is missing.
> Example:
> {code:java}
> <h:form id="frmTest">
> <p:selectOneMenu id="test1">
> <f:selectItems value="#{testView.items}" var="i"
> itemValue="#{i.value}" itemLabel="#{i.value} - #{i.label}" />
> </p:selectOneMenu>
> <p:selectOneMenu id="test2">
> <f:selectItems value="#{testView.items2}" var="i"
> itemValue="#{i.key}" itemLabel="#{i.key} - #{i.value}" />
> </p:selectOneMenu>
> <p:selectOneMenu id="test3">
> <f:selectItems value="#{testView.items}" />
> </p:selectOneMenu>
> <p:selectOneMenu id="test4">
> <f:selectItems value="#{testView.items2}" />
> </p:selectOneMenu>
> </h:form>{code}
> The issue is `id="test1"` the user is expecting it to render
> `itemLabel="#\{i.key} - #\{i.value}"` but it is ignored and just the
> underlying Java SelectItem value is rendered.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)