問題
- 製品の最新バージョンをターゲットにした後、
FooLocalServiceBaseImpl
クラスに注入された@Reference
に対して 'cannot find symbol' エラーが発生する場合があります。 こんな感じだ:error: cannot find symbol
protected com.liferay.asset.kernel.service.AssetLinkLocalService - この例では、エンティティの
service.xmlは
以下のようになる:<reference entity="AssetLink" package-path="com.liferay.portlet.asset" />
環境
- Liferay Workspace
解像度
- これは、参照されているエンティティが別のパッケージ(おそらくカーネルからOSGiモジュールへ)に移動した場合に発生する可能性がある。
- プロジェクトコードで参照されているエンティティを検索することで、それがあなたのケースであるかどうかを確認することができます。
- そのような場合は、次のような方法がある:
- エンティティの
service.xmlから
、その<参照>
を削除する。 - 代わりに、
@Reference
アノテーションを使用して、FooLocalServiceImpl
から目的の*LocalService
クラスを参照します。 - これは製品内部で行われてきたことだ。
アセットリンクの
モジュール化を例にとれば:- LPS-139732で実装された。
-
<
このコミットにより、>
の参照が削除された。 -
このコミットで
*LocalServiceImp
クラスに@参照が
追加されました。
- エンティティの
- なお、
パッケージパスを
変更しただけでは、以下のようなエラーが発生する:Unable to find AssetLink in Foo
Example in thread "main" com.liferay.portal.tools.service.builder.ServiceBuilderException:Unable to find AssetLink in Foo
at com.liferay.portal.tools.service.builder.ServiceBuilder.getEntity(ServiceBuilder.java:1244)
at com.liferay.portal.tools.service.builder.ServiceBuilder._resolveEntity(ServiceBuilder.
at com.liferay.portal.tools.service.builder.ServiceBuilder._resolveEntity(ServiceBuilder.java:8000)<init>(ServiceBuilder.java:805)
at com.liferay.portal.tools.service.builder.ServiceBuilder.main(ServiceBuilder.java:234)
Caused by: java.io.IOException:Unable to open resource com/liferay/asset/link/service.xml in class loader sun.misc.Launcher$AppClassLoader@1b6d3586
at com.liferay.portal.kernel.util.StringUtil.read(StringUtil.java:2286)
at com.liferay.portal.kernel.util.StringUtil.read(StringUtil.java:2254)
at com.liferay.portal.tools.service.builder.ServiceBuilder.getEntity(ServiceBuilder.java:1239)- 別の記事で紹介している別の方法を使うこともできる。