Fórum

Cast exception in standart portlet

Alexander Yarkeev, modificado 8 Anos atrás.

Cast exception in standart portlet

New Member Postagens: 3 Data de Entrada: 21/07/15 Postagens Recentes
Добрый день! Столкнулся со следующей проблемой:
При переопределении с помощью hook плагина существующего struts action'a. Конкретно - переопределяю "shopping/checkout". Во время выполнения портлет падает на строке:

String returnURL = ShoppingUtil.getPayPalReturnURL(((ActionResponseImpl) actionResponse).createActionURL(), order); //Код стандартный, всё как в исходниках
Подебажил код, ошибка происходит во время каста, далее измененный код, с выявлением ошибки.

ActionResponseImpl actionResponseImpl = ((ActionResponseImpl) actionResponse);

Во время remote debug, после выполнения этой строчки(вне зависимости от хода движений "step over" или же "step into" вылетаем на catch блок, в каком-то классе ClassLoader'а с TargetInvocationException....

Не мог бы кто подсказать, в чём проблема и как вообще может пройзойти каст класса javax.portlet.ActionResponse к классу com.liferay.portlet.ActionResponseImpl ?


Заранее спасибо.
thumbnail
Alexey Kakunin, modificado 8 Anos atrás.

RE: Cast exception in standart portlet

Liferay Master Postagens: 621 Data de Entrada: 07/07/08 Postagens Recentes
Добрый день.
ActionResponseImpl - это класс который находится в portal-impl.jar
Как вы его получили в вашем хуке? Подозреваю что добавили portal-impl в зависимости и он у вас лег в WEB-INF/lib хука.
Я прав?
Alexander Yarkeev, modificado 8 Anos atrás.

RE: Cast exception in standart portlet

New Member Postagens: 3 Data de Entrada: 21/07/15 Postagens Recentes
Именно так, как вы и подозреваете. А в этом есть какие-то проблемы?
thumbnail
Alexey Kakunin, modificado 8 Anos atrás.

RE: Cast exception in standart portlet (Resposta)

Liferay Master Postagens: 621 Data de Entrada: 07/07/08 Postagens Recentes
Добрый день!

portal-impl.jar должен быть в системе один - и лежать он должен в webapps/ROOT/WEB-INF/lib - все другие варианты чреваты самыми разными side-effect-ами.

Конкретно в вашем случае - запрос пришел сначала в портал (приложение /ROOT) и там для него был сформирован класс ActionResponseImpl (взятый из /ROOT/WEB-INF/lib/portal-impl.jar)
Потом запрос был передан в ваш хук, в котором вы пытаетесь привести его к классу ActionResponseImpl из /your-hook/WEB-INF/lib/portal-impl.jar

И это мы понимаем - что это один и тот же класс из одинакового jar-ника - для classloader-а это два класса (пусть и с одинаковым именем) из двух разных jar-ников - почему вы и получаете ClassCastException.

В плагинах (в том числе хуках) можно использовать только классы, доступные из portal-service и различных util-xxx jar-ников. Исключение - ext-plugin - но это совсем другая история.

Если вы пытаетесь "допилить" штатный Liferay-евский магазин - рекомендую обратить внимание на эту демку - http://www.youtube.com/watch?v=czD6kjZrFjs - возможно это то что вам надо.