ClassCastException в selectManyMenu - целое число не может быть приведено к строке

Список, переданный в значение выбора, имеет тип Integer.

<p:selectManyMenu id="estabelecimentos" value="#{questionarioMB.estabelecimentosIds}" var="e" converter="#{estabelecimentoConverter}" style="width:100%" filter="true" filterMatchMode="contains" showCheckbox="true">
    <f:selectItems value="#{questionarioMB.estabelecimentos}" var="estabelecimento" itemValue="#{estabelecimento}" itemLabel="#{estabelecimento.nomefantasia}" />
    <p:column>
        <h:outputText value="#{estabelecimentoMB.getIdentificadorByEstabelecimentoId(e.id)}" />
    </p:column>
    <p:column>
        <h:outputText value="#{e.nomefantasia}" />
    </p:column>
</p:selectManyMenu>

NetBeans не может найти атрибуты в outputTexts ("неизвестное свойство"), и строка, выдающая исключение, выглядит следующим образом:

this.estabelecimentosIds.parallelStream().forEach((Integer id) -> {
    this.questionarioBean.insertQuestionarioHasEstabelecimento(this.questionarioBean.getLastId() + 1, id);
});

Конвертер:

@Named
public class EstabelecimentoConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
        if (value != null && value.trim().length() > 0) {
            try {
                EstabelecimentoMB estabelecimentoMB = (EstabelecimentoMB) fc.getExternalContext().getApplicationMap().get("estabelecimentoMB");
                return estabelecimentoMB.getEstabelecimentos().get(Integer.parseInt(value));
            } catch (NumberFormatException e) {
                throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro de Conversão", "Estabelecimento inválido."));
            }
        } else {
            return null;
        }
    }

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object o) {
        if (o != null) {
            return String.valueOf(((Estabelecimento) o).getId());
        } else {
            return null;
        }
    }
}

PS: я не могу использовать поле tradingName потому что это может быть повторено в таблице establishmentпоэтому я должен использовать "id", чтобы различать их. Первый столбец имеет идентификатор для этого заведения (в другой таблице "client_has_establishment") и может также повторяться, но не для того же самого client_id).

1 ответ

Решение

На основании ответа BalusC здесь: /questions/13343556/kak-svyazat-znacheniya-listinteger-s-selectmanylistbox-v-jsf/13343562#13343562

Изменен конвертер в JSF, встроенный в IntegerConverter:

<p:selectManyMenu ... converter="javax.faces.Integer">

Другие вопросы по тегам