JSF ClassCastException при подготовке данных в бине

Я просто пробую JSF и столкнулся с уродливым ClassCastException,

У меня есть управляемый бин (CustomerBean) который имеет POJO (Customer) где я храню пользовательские данные. Одним из свойств POJO является List<CathegoryType.Type> preferredCathegories (с геттером и сеттером). CathegoryType это модельный класс, который предоставляет категории (через вложенный enum Type) и их локализованные имена (через метод getCathegory(Type type)).

Теперь у меня есть одна страница JSF для ввода пользовательских данных (editCustomer.xhtml). Есть раздел для выбора предпочтительных категорий. Код JSF для выбора категорий выглядит следующим образом:

<h:selectManyListbox 
        id="pcat"
        value="#{customerBean.customer.preferredCathegories}"
        styleClass="form-control">
    <f:selectItems 
            value="#{customerBean.cathegoryTypes}">
    </f:selectItems>
</h:selectManyListbox>

Компонент renderes выглядит следующим образом: Отображает <code>List<SelectItem> CustomerBeand.cathegoryTypes</code> обеспечивает отображение литералов перечисления на их имена, такие как <code>new SelectItem(type, CathegoryType.getCathegory(type))</code>, Теперь приходит сложная часть, которая бросает <code>ClassCastException</code> (в моем понимании без причины!)</p><p>Когда я отправляю форму на другую страницу JSF (<code>showCustomer.xhtml</code>) должен представлять только что введенные данные пользователя. Но создание представления завершается с выдачей следующего ClassCastException:</p><pre><code>SCHWERWIEGEND: Servlet.service() for servlet [Faces Servlet] in context with path [/...] threw exception [java.lang.String cannot be cast to ...CathegoryType$Type] with root cause
java.lang.ClassCastException: java.lang.String cannot be cast to ...CathegoryType$Type
    at ...CustomerBean.getNamedPreferredCathegories(CustomerBean.java:247)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    ...
</code></pre><p>Чтобы представить выбранные категории, <code>showCustomer.xhtml</code> вызывает метод <code>String CustomerBean.getNamedPreferredCathegories()</code>:</p><pre><code><h:outputText value=

Этот метод рассчитывает String из выбранных категорий:

def String getNamedPreferredCathegories() {
    val StringBuilder names = new StringBuilder
    val List<CathegoryType.Type> cathegories = customer.preferredCathegories
    val ListIterator<CathegoryType.Type> iter = cathegories.listIterator
    var boolean first = true
    while (iter.hasNext) {
        val CathegoryType.Type cat = iter.next
        val String name = cathegoryType.getCathegory(cat)
        if(first) first = false else names.append(', ')
        names.append(name)
    }
    return names.toString
}

Я использую программирование Xtend. Это язык JVM (компилируется в код Java) и, следовательно, полностью совместим с системой типов Java. Я пытался написать этот метод как Java, как это возможно, обычно это можно сделать в одну строку:

def String getNamedPreferredCathegories() {
    '''«FOR name : customer.preferredCathegories.map[cathegory] SEPARATOR ', '»«name»«ENDFOR»'''.toString
}

Так как я делаю любую итерацию по списку, ClassCastException брошен... но, как видно, я не выполняю никаких операций приведения в моем коде! Так откуда же происходит исключение?

Я запускаю проект на Tomcat 8.5.9.

Редактировать: Хорошо, сгенерированный Java-метод моего Xtend-метода выглядит следующим образом:

public String getNamedPreferredCathegories() {
    final StringBuilder names = new StringBuilder();
    final List<CathegoryType.Type> cathegories = this.customer.getPreferredCathegories();
    final ListIterator<CathegoryType.Type> iter = cathegories.listIterator();
    boolean first = true;
    while (iter.hasNext()) {
        {
            final CathegoryType.Type cat = iter.next(); // Exception is thrown here!
            final String name = this.cathegoryType.getCathegory(cat);
            if (first) {
                first = false;
            } else {
                names.append(", ");
            }
            names.append(name);
        }
    }
    return names.toString();
}

Исключение выдается в отмеченной строке (final CathegoryType.Type cat = iter.next();). Кроме того, сгенерированные части Java связанных Customer класс это:

public class Customer {

    private List<CathegoryType.Type> preferredCathegories;

    public List<CathegoryType.Type> getPreferredCathegories() {
        return this.preferredCathegories;
    }

    public void setPreferredCathegories(final List<CathegoryType.Type> preferredCathegories) {
        this.preferredCathegories = preferredCathegories;
    }
}

Кроме того, я посмотрю на связанный вопрос, который может обсудить точно такую ​​же проблему.

0 ответов

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