Использование сервисов портлета в другом плагине Liferay

Мы пытаемся использовать службы одного портлета (портлет A) в другом портлете (портлет B). Мы поместили jar-файл служб (портлет A) в \tomcat-7.0.27\webapps\ROOT\WEB-INF\lib и включили этот jar-файл в display plugin packages.xml другого портлета (портлета B).

Мы используем внешнюю базу данных, т.е. мы внесли изменения в portlet-spring.xml.

Если я развертываю портлет, содержащий фактические службы (портлет A), и вызываю какой-либо метод служб, тогда он вызывается нормально и извлекает данные. Если мы напишем тот же метод в другом портлете (портлет B), он извлечет данные. Но проблема возникает, когда мы пытаемся написать метод в другом портлете (портлет B), который не был вызван в фактическом сервисном портлете (портлет A), тогда данные не извлекаются. Он всегда приносит пустой.

Может кто подскажет в чем может быть причина.

Мы не можем разместить все портлеты в одном банке, так как ни один из портлетов не очень большой (около 35).

Или есть другое лучшее решение, чем помещать файл jar в каталог lib?


person Danish    schedule 09.07.2013    source источник
comment
я думаю, ваши банки должны быть внутри каталога \tomcat-7.0.27\lib\ext   -  person Laxman Rana    schedule 09.07.2013


Ответы (1)


Как комментирует Lucky Boy, один из вариантов — поместить ваши файлы *-service.jar в глобальный путь к классам, tomcat/lib/ext

Другой вариант — явно назвать зависимости: отредактируйте WEB-INF/liferay-plugin-package.properties вашего плагина и добавьте зависимость к другому плагину, который вам нужен для этого плагина:

required-deployment-contexts=my-other-portlet,my-custom-hook

Это гарантирует, что плагин, содержащий это объявление, будет развернут только после того, как зависимости уже развернуты, а также скопирует свои служебные файлы в «себя» - например. my-other-portlet-service.jar и my-custom-hook-service.jar автоматически попадут в ваше собственное веб-приложение, готовое к использованию.

person Olaf Kock    schedule 09.07.2013
comment
Уважаемый Олаф Кок, я пробовал оба метода, как указано выше. Но с этим я столкнулся с другой проблемой. Я не могу найти класс XXXXImpl в портлете B. Мне нужно создать объект вида XXXX xxxx = new XXXXImpl(); . Любое предложение о том же. - person Danish; 10.07.2013
comment
Прошу прощения, но нет. Классы *Impl не являются частью интерфейса службы — разработчик службы помещает их в папку плагина WEB-INF/src, которая не является частью *-service.jar. Это предусмотрено дизайном, и вы не должны предполагать, что у вас есть доступ к этим классам. Однако вы можете делегировать создание объекта своему сервисному классу, и ваша служба просто вернет объект virgine XXXImpl (который, скорее всего, станет XXXWrapper в вашем зависимом проекте. - person Olaf Kock; 10.07.2013
comment
Сделано.. :-) XXXX xxxx = XXXXLocalServiceUtil.createXXXXX(-1 или 0) Это не создаст запись в базе данных, но вернет пустой экземпляр, который так же хорош, как и new XXXXImpl() . Если у вас есть таблица с несколькими первичными ключами, создайте объект xxxxxpk и передайте его в конструкторе XXXXLocalServiceUtil.createXXXXX . Большое спасибо... - person Danish; 10.07.2013