Исключение ":"java.lang.ClassCastException в Liferay Service Builder
Я работал над внедрением удаленного сервиса Entity. Я создал один метод пользовательского сервиса в EntityServiceImpl, Создал метод пользовательского сервиса, предоставляющий сервис через InstitutionServiceUtil. После развертывания портлета, при отправке запроса на метод сервиса через окно браузера, я получаю ниже Исключение
exception":"java.lang.ClassCastException: com.institutions.model.impl.InstitutionImpl
cannot be cast to com.institutions.model.Institution
Примечание: если я отправлю запрос после перезапуска сервера, я не получу выше исключения.
Как решить вышеупомянутое исключение?
2 ответа
Я предполагаю, что InstitutionImpl
реализует интерфейс Institution
, Если это так, то основной причиной исключения является загрузка классов: загрузчик классов A загрузился Institution
но InstitutionImpl
был загружен из другого загрузчика классов. Два класса в Java эквивалентны, только если полное имя и загрузчик классов совпадают.
Я не знаю достаточно о LifeRay, чтобы рассказать вам, как работает загрузка классов. Но чтобы решить проблему, нужно выяснить, Institution
Интерфейс может уже существовать, когда вы пытаетесь загрузить свою реализацию (возможно, из предыдущей попытки развертывания).
При развертывании портлетов, которые выдают исключение приведения класса, выполните следующие действия:
- разверните приложение в liferay/deploy.
- отключить liferay
- переместите сервисный jar из WEB-INF/lib из портлета в /lib/ext tomcat
- удалить временную и рабочую папку из кота
- перезапустите кота.
ИЛИ... что сработало для меня
- изменить имя пакета при сборке service.xml в файле service.xml
Или, если вы уже создали сервис, выполните следующие действия.
Просто удалите 5 пакетов, созданных в сервис-сборщике, т.е.
model.impl
service.base
service.http
service.impl
service.persistence
удалить XML-файл, созданный в папке META-INF, за исключением файла ext-spring.xml.
- удалите XX-service.jar из папки docroot/lib
- удалите служебную папку в папке docroot.
- измените имя пакета в service.xml и постройте путь.