問題
- リファレンスによるサービスモジュールの作成
<reference entity="MBMessage" package-path="com.liferay.message.boards" />
をservice.xmlに記述してください。
gradle buildServiceは次のように失敗します。
スレッド "main" の例外 com.liferay.portal.tools.service.builder.ServiceBuilderException:Unable to find MBMessage in Foo
at com.liferay.portal.tools.service.builder.ServiceBuilder.getEntity(ServiceBuilder.java:1114)
at com.liferay.portal.tools.service.builder.ServiceBuilder._resolveEntity(ServiceBuilder.java:6784)
at com.liferay.portal.tools.Service.builder.ServiceBuilder.<init>(ServiceBuilder.java:728)
at com.liferay.portal.tools.service.builder.ServiceBuilder.main(ServiceBuilder.java:230)
Caused by: JAVA.IO.IOException:Unable to open resource in class loader com/liferay/message/boards/service.xml
at com.liferay.portal.kernel.util.StringUtil.read(StringUtil.java:2301)
at com.liferay.portal.kernel.util.StringUtil.read(StringUtil.java:2261)
at com.liferay.portal.tools.service.builder.ServiceBuilder.getEntity(ServiceBuilder.java:1109)
...3 more
環境
- DXP 7.1
解決策
-
service.xmlに記載された参照エンティティの参照を自動生成する場合、サービスビルダーは、ツール自体のクラスパスの特定の場所にあるservice.xmlファイルを参照できるように制限されています( Service Builder Gradle Plugin documentationに記載されている「serviceBuilder」設定)。
メッセージボードのエンティティを参照できるのは、チェックされるservice.xmlファイルの1つがサービス用のものだからです(だから、いつでも自分のエンティティを参照できます)。 他の参照(AssetEntryなど)が機能する理由は、便利な機能として、サービスビルダーがツール自体の中に多くのservice.xmlファイルを束ね、それらを参照エンティティとして簡単に使用できるようにするためです。
https://github.com/liferay/liferay-portal/blob/master/modules/util/portal-tools-service-builder/bnd.bnd
メッセージボードの場合、レガシーな理由から、パッケージパス「com.liferay.message.boads」ではなく、パッケージパス「com.liferay.portlet.messageboards」で掲載されています。 サービスビルダーで利用可能な組み込みの設定を使用したい場合は、代わりにこのレガシーパッケージパスの値を使用する必要があります。
自動的にバンドルされないエンティティ(カスタムエンティティなど)を参照したり、異なるパッケージパスのエンティティ(例えば、com.liferay.message.boadsを使用したい場合)を使用しようとする場合、次のような手順で行います:
- service.xmlファイルを格納するフォルダを追加する(この例では、「service-xml-references」と呼ぶことにします)。
- このフォルダをGradleのserviceBuilderの設定に追加します(dependenciesブロック内)。
dependencies {
...
serviceBuilder files("service-xml-references")
} - 参照したい各 service.xml ファイルについて、パッケージのパスと同じフォルダを作成します(例えば com.liferay.message.boards の場合は service-xml-references/com/liferay/message/boards フォルダを作成し、その中に service.xml を配置します)。
レガシーな理由で、別のフォルダを作成してクラスパスに追加したくない場合、Liferayは実装のための.javaファイルを含むフォルダもチェックします。 例えば、src/main/java/com/liferay/message/boardsというフォルダを作り、その中にservice.xmlを追加することができます。