FacesContext.getCurrentInstance () бросает java.lang.VerifyError: несогласованные кадры карты стека при исключении целевой ветви

Я уже проверил другие ответы stackoverflow, но ни у одного из них не было ответа для JSF facescontext, поэтому мне пришлось задать вопрос. У нас были jdk 6, jsf 1.2 и mySQL 5.5, а теперь мы обновились до java 8 и mySQL 5.7. Для этого я заменил jar-файл mySql-connector с 3.1.11 на 5.1.18. Но когда я запускаю tomcat, он выдает исключение, как показано ниже:

SEVERE: Exception sending context initialized event to listener instance of class [com.sun.faces.config.ConfigureListener]
java.lang.VerifyError: Inconsistent stackmap frames at branch target 922
Exception Details:
  Location:
    web/clerk/webapp/iucs/officer/bean/OfficerScheduleBean.addOfficerSchedule()Ljava/lang/String; @922: invokestatic
  Reason:
    Type top (current frame, locals[41]) is not assignable to integer (stack map, locals[41])
  Current Frame:
    bci: @904
    flags: { }
    locals: { 'web/clerk/webapp/iucs/officer/bean/OfficerScheduleBean', 'java/lang/String', 'java/io/InputStream', 'java/util/List', 'java/io/BufferedReader', 'javax/servlet/http/HttpSession', 'web/clerk/webapp/iucs/userprofile/pojo/UserProfile', 'java/util/Map', 'java/util/List', 'web/clerk/webapp/iucs/officer/pojo/OfficerSchedule', 'java/lang/String', '[Ljava/lang/String;', integer, integer, 'java/util/Map', 'java/util/Set', integer, integer, 'web/clerk/webapp/iucs/officer/pojo/OfficerSchedule', 'java/util/Iterator', 'java/util/List', 'web/clerk/webapp/iucs/schedule/pojo/CourtType', 'web/clerk/webapp/iucs/schedule/pojo/Location', 'java/lang/String', 'java/lang/String', 'java/lang/String', 'java/lang/String', 'java/lang/String', 'web/clerk/webapp/iucs/general/pojo/County', 'java/lang/String', integer, top, 'web/clerk/webapp/iucs/general/pojo/County', 'web/clerk/webapp/iucs/officer/pojo/OfficerSchedule', integer, integer, integer, integer, integer, integer }
    stack: { 'web/clerk/webapp/iucs/general/pojo/County' }
  Stackmap Frame:
    bci: @922
    flags: { }
    locals: { 'web/clerk/webapp/iucs/officer/bean/OfficerScheduleBean', 'java/lang/String', 'java/io/InputStream', 'java/util/List', 'java/io/BufferedReader', 'javax/servlet/http/HttpSession', 'web/clerk/webapp/iucs/userprofile/pojo/UserProfile', 'java/util/Map', 'java/util/List', 'web/clerk/webapp/iucs/officer/pojo/OfficerSchedule', 'java/lang/String', '[Ljava/lang/String;', integer, integer, 'java/util/Map', 'java/util/Set', integer, integer, 'web/clerk/webapp/iucs/officer/pojo/OfficerSchedule', 'java/util/Iterator', 'java/util/List', 'web/clerk/webapp/iucs/schedule/pojo/CourtType', 'web/clerk/webapp/iucs/schedule/pojo/Location', 'java/lang/String', 'java/lang/String', 'java/lang/String', 'java/lang/String', 'java/lang/String', 'web/clerk/webapp/iucs/general/pojo/County', 'java/lang/String', integer, top, 'web/clerk/webapp/iucs/general/pojo/County', 'web/clerk/webapp/iucs/officer/pojo/OfficerSchedule', integer, integer, integer, integer, integer, integer, top, integer }
    stack: { }
  Bytecode:
    0x0000000: bb00 a559 2ab6 00a7 b600 adb8 00b2 b700
    0x0000010: b813 0720 b600 bcb6 00c0 b800 c312 fb4c
    0x0000020: 2ab6 0722 c600 112a b607 22b9 05c4 0100
    0x0000030: 0994 9a00 2a13 0725 12fb b802 ecbb 00a5
    0x0000040: 592a b600 a7b6 00ad b800 b2b7 00b8 1307.....

Раскапывая код, я обнаружил, что внутри метода с ошибками, код FacesContext.getCurrentInstance(); является ошибочным. Когда я проверил соответствующую банку, она указывает на jsf-api.jar..Теперь я знаю, что одно из таких решений - добавить аргумент -не проверить в виртуальную машину, но, тем не менее, это может быть патч, просматривающий мою производственную среду, я не могу понять, в чем основная причина и какое может быть решение?

Какая именно версия Java8? Пробовали новее? Почему это ошибка FacesContext.getCurrentInstance (), а не ошибка в вашем способе ее использования? Ошибка указывает на ваш класс, а не на класс FacesContext.

BalusC 01.11.2018 11:42

Неужели мы все еще должны говорить об этом в 2018 году? Обновите все инструменты, библиотеки или фреймворки, которые выполняют обработку байт-кода. Java 6 поддерживает возврат к старому верификатору, если проверка карт стека не удалась; начиная с Java 8, такого отката больше нет. На обновление ушло более десяти лет.

Holger 01.11.2018 11:55

@BalusC Мы обновились до Java 1.8.0181. О лицах: Да, в моем методе ошибка показывает исключение. Но я проследил до точной линии и пришел к выводу и нашел точную строку ошибки, которая является FacesContext.getCurrentInstance();.

Aakash Patel 01.11.2018 13:04

@Holger Я не могу обновить все инструменты: на самом деле это была наша первоначальная идея, но мы обнаружили, что нам нужно изменить почти все строки кода, чтобы обновить jsf с 1.2 до 2.2, что было невозможно в указанные крайние сроки. Итак, теперь мы обновляем только java и mySQL в бэкэнде.

Aakash Patel 01.11.2018 13:06

Я не знаю, делегирует ли jsf другую библиотеку для обработки байт-кода, поэтому вы можете обновить только эту библиотеку. Но в любом случае у вас все еще есть варианты: 1) оставаться с Java 6, поскольку не имеет значения, какую устаревшую версию Java вы используете, или 2) просто жить с ошибкой.

Holger 01.11.2018 13:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
181
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нашел верный аргумент: На самом деле я попытался добавить webdir в переменную среды из безопасного режима, но это тоже не сработало. Поэтому я удалил это и добавил -Xverify: нет к аргументу tomcat, и он начал работать.

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