Всегда ли значение, помещенное в карту viewScope в EL без явного преобразования, приводится к java .lang.String? - PullRequest
0 голосов
/ 18 июня 2020

Значение в f:selectItem является целым числом (Const.DB_NEW_DATASET), но результат testlistener всегда java.lang.String. Это не то, что я ожидал.

x html

<f:metadata>
    <f:importConstants type="foo.bar.Const" />
</f:metadata>
<h:selectOneListbox value="#{viewScope.foo}">
    <f:selectItem
        itemValue="#{Const.DB_NEW_DATASET}"
        itemLabel="foo" />
    <f:selectItem
        itemValue="#{Const.DB_NEW_DATASET}"
        itemLabel="bar" />
    <f:ajax listener="#{myBean.testlistener}" />
</h:selectOneListbox>

bean

@Named
@ViewScoped
public class MyBean implements Serializable {
    @Inject
    @ViewMap
    private Map<String, Object> viewMap;

    public void testlistener() {
        System.out.println(viewMap.get('foo').getClass());
    }
}


public class Const {
    public static final Integer DB_NEW_DATASET = -1;
}

Mojarra 2.3.9.SP01

1 Ответ

2 голосов
/ 18 июня 2020

На самом деле это вообще не "приведение к java.lang.String". Это просто тип по умолчанию ServletRequest#getParameter(), который затем остается неконвертированным JSF.

Это потому, что ValueExpression#getType() из #{viewScope.foo} возвращает java.lang.Object и поэтому JSF не будет выполнять автоматическое преобразование c для любого зарегистрированного @FacesConverter(forClass).

Вам необходимо явно указать встроенный javax.faces.Integer преобразователь, который по сути является @FacesConverter(forClass=java.lang.Integer).

<h:selectOneListbox ... converterId="javax.faces.Integer">

В этом нет необходимости, если вы используете, например, #{bean.foo} с private Integer foo, потому что таким образом ValueExpression#getType() вернет java.lang.Integer и, таким образом, JSF может найти встроенный -in преобразователь.

См. также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...