Класс Finder Util не создается с помощью Liferay 7 Service Builder

В то время как у меня не было проблем с Service Builder в Liferay 6.2, я сталкиваюсь с проблемой блокировки в Liferay 7, когда я создаю сервис для создания своего первого класса Finder Util. Когда я это обнаружил, я даже решил начать с нуля проект, проблема все еще здесь. Даже с официальным документом ничего не работает.

Есть ли у кого-нибудь идея помочь мне?

Вот полное описание моего последнего теста в Eclipse Mars:

  1. Создайте новое рабочее пространство Liferay
  2. Создайте новый сервисный конструктор модуля проекта Liferay.
  3. Создайте объект foo в service.xml
  4. Сервисы сборки (класс хорошо сгенерирован)
  5. Создайте вручную класс FooFinderImpl в пакете persistence.impl.
  6. Создание сервисов
    Интерфейс FooFinder сгенерирован правильно, но класс FooFinderUtil не сгенерирован.
  7. Добавьте несколько методов в класс FooFinderImpl.
  8. Сервисы сборки
  9. Ничего нового

Спасибо за помощь.

Винсент


person Vincent    schedule 25.11.2016    source источник


Ответы (2)


Когда вы создаете службу, в build.gradle есть некоторые свойства, поэтому, если вы хотите сгенерировать класс Util, необходимо установить для osgiModule значение false.

buildService {
    apiDir = "../foo-api/src/main/java"
    osgiModule = false
    propsUtil = "com.liferay.docs.foo.service.util.PropsUtil"
}

В противном случае, если вы хотите использовать osgi, вы можете найти искатель таким образом.

@Reference
private volatile FooFinder fooFinder;

or

@Reference(unbind = "-")
protected void setFooFinder(
        FooFinder fooFinder) {

    _fooFinder = fooFinder;
}

private FooFinder _fooFinder;

для получения дополнительной информации см. документы liferay https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-0/finding-and-invoking-liferay-services

пример на github http://github.com/bruinen/liferay-services-example

person Romeo Sheshi    schedule 30.11.2016
comment
Большое спасибо за ваш ответ ! Ваше первое предложение решило проблему, но я бы оставил OSGI. Итак, я только что попробовал второй, но мой искатель имеет значение null, должен ли я объявлять его где-либо еще? - person Vincent; 02.12.2016
comment
вы можете попробовать другой код, который я добавляю в редактировании. Справочник берет сервисную реализацию интерфейса, поэтому вам просто нужно развернуть пакет osgi foo-service и foo-api. попробуйте импортировать пакет в пакет, который вы используете для поиска Import-Package: com.liferay.foo.service . - person Romeo Sheshi; 02.12.2016
comment
Хорошо, мой искатель по-прежнему не работает с третьим решением, но я собираюсь прочитать документацию Liferay, о которой вы упомянули. Я сообщаю вам новости. - person Vincent; 02.12.2016
comment
если я использую FooFinder в моем FooLocalServiceImpl с аннотацией @Reference, могу ли я вызвать метод класса FooLocalServiceImpl через FooLocalServiceUtil или мне нужно объявить FooLocalService с аннотацией @ServiceReference в моем модуле портлета? - person Vincent; 02.12.2016
comment
Я думаю, что оба способа будут работать одинаково, потому что класс Util использует serviceTracker для получения реализации, поэтому это будет та же логика @Reference. - person Romeo Sheshi; 02.12.2016
comment
К сожалению, мой искатель по-прежнему пуст со всеми этими решениями. - person Vincent; 02.12.2016
comment
Я пытаюсь сделать тест на местном - person Romeo Sheshi; 02.12.2016
comment
Большое спасибо за Вашу помощь - person Vincent; 02.12.2016
comment
привет, я делаю тест, и он работает с @Reference private volatile FooFinder fooFinder;, я передаю пример в git github.com/bruinen/ liferay-услуги-пример - person Romeo Sheshi; 02.12.2016
comment
И последнее (извините, что беспокою вас еще раз). Я хотел бы добавить сервисный уровень между портлетом и классом поиска. Как вам это удается? Потому что у меня снова есть нулевой искатель, когда я добавляю этот сервисный слой? ‹br/› Подробности: В портлете @Reference работает для объявления интерфейса FooLocalService. В FooLocalServiceImpl @Reference не работает для объявления интерфейса FooFinder, интерфейс имеет значение null. У вас есть идея? - person Vincent; 06.12.2016
comment
Просто используйте геттер из BaseImpl getFooFinder() без установки ссылки - person Romeo Sheshi; 06.12.2016
comment
Хороший ! Спасибо за потраченное время! Хорошего дня ! - person Vincent; 06.12.2016
comment
приятно помочь, вы тоже! - person Romeo Sheshi; 06.12.2016

Из https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-0/custom-sql

Примечание. В предыдущих версиях Liferay Portal ваши методы поиска были доступны через служебные классы -FinderUtil. Методы поиска теперь внедряются в локальные службы вашего приложения, что избавляет от необходимости вызывать утилиты поиска.

Теперь вы должны иметь возможность напрямую вызывать свой метод поиска на уровне сервиса: fooFinder.findBy...

person Scott Lee    schedule 24.04.2018