Список <String>Полученный список <Long>в JSF 2.3 - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть Обновление моего проекта с JSFContainer 2.2 до JSFContainer 2.3

<p:selectManyListbox id="acl" value="#{controller.process.basisList}" >  
    <f:selectItems value="#{controller.filinglist}" />  
</p:selectManyListbox> 

В списке файлов есть объект класса, такой как ob (1L, 'data1');BaseList с универсальным типом String

при работе с JSFContainer 2.2, CDI 1.2 и EL 3.0.все работает нормально, длинные данные были сохранены как String в BaseList List.Я понимаю эту концепцию в приведенном ниже URL-адресе

API отражения Java

Но в JSFContainer 2.3, CDI 2.0 и EL 3.0.Я получил следующую ошибку

, когда я запускаю код

for(String i : basisList) {
    System.out.println(i);
}

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String.

Я отлаживаю с использованием кода ниже

for(Object i : basisList) {
        System.out.println(i.getClass() + " > " + i);
    }

Выходчто я получаю ниже

class java.lang.Long > 3

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Это правильное поведение при обновлении с JSF 2.2 до JSF 2.3.Ранее JSF 2.2 и старше не выполняли автоматическое преобразование этих значений, что на самом деле было , а не ожидаемым поведением.

Это указано в UISelectMany javadoc для JSF 2.3 .

Получите Converter, используя следующий алгоритм:

  • Если к компоненту прикреплен Converter, используйте его.

  • Если нет, найдите значение ValueExpression (если оно есть).ValueExpression должен указывать на что-то:

    • Массив примитивов (например, int[]).Найдите зарегистрированный подкласс Converter для этого примитивного типа.

    • Массив объектов (например, Integer[] или String[]).Найдите зарегистрированный подкласс Converter для базового типа элемента.

    • A java.util.Collection.Не конвертируйте значения. Вместо этого преобразуйте предоставленный набор доступных параметров в строку, точно так же, как это делается во время ответа рендеринга, и для любого соответствия с переданными значениями добавьте доступную опцию как объект в коллекцию.

Если по какой-либо причине невозможно найти Converter, предположите, что тип является массивом String.

Подчеркнутая часть приведенного выше блока цитатыновинка, начиная с JSF 2.3 (для сравнения вот вариант JSF 2.2 UISelectMany javadoc ).

Вам необходимо исправить basisList, чтобы он стал точно такого же типа, как и filinglistили же вам нужно прикрепить явное Converter.

0 голосов
/ 27 февраля 2019

Возможно, ваш BaseList имеет тип <Object>, поэтому при создании цикла for с String Java пытается преобразовать это значение в переменную String i.В вашем случае кажется, что у вас есть список, частично или полностью заполненный примитивными типами long, которые нельзя просто привести к строке.Вы могли бы написать такой код, который бы поддерживал оба случая.

List<Object> basisList = new ArrayList<>();

for (Object o : basisList) {
  if (o instanceof String) {
    System.out.println(o.toString());
  } else if(o instanceof Long){
    System.out.println(Long.toString((Long) o));
  } else {
    System.out.println("Some other type = " + o.toString());
  }
}

...