![Отображает <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=](/images/b7ea5b6dd557d4d4d15b316196a318dca94a5983.png)
Этот метод рассчитывает 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;
}
}
Кроме того, я посмотрю на связанный вопрос, который может обсудить точно такую же проблему.