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 ?
Заранее спасибо.
При переопределении с помощью 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 ?
Заранее спасибо.
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 хука.
Я прав?
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
Именно так, как вы и подозреваете. А в этом есть какие-то проблемы?
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 - возможно это то что вам надо.
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 - возможно это то что вам надо.