空のサービスが必要なケース
LiferayにはService Builderという仕組みがあり、データベースアクセスをモデルへのアクセスとして隠蔽してくれる仕組みがあるが、データベースへのレコードの作成は必要ないが、以下の理由で空のサービスが必要になるケースがある。
- Web APIが必要
- 複数の他のサービスを組み合わせて、1つのトランザクションとして扱いたい(ユーザーが登録されたら、同時にサイトも作成する、のような場合、ユーザー管理のサービスと、サイト管理のサービスを1つのトランザクションで扱う必要がある、など)
- データベースアクセスのない、カスタムのサービスを作成したい。(計算処理を行う、文字列処理を行う、など)
その際に以下の方法でデータベースにレコードを作成しないサービスを作成できる。ただし、データベースにテーブルは生成されてしまう。
生成手順
- 通常通り、Liferay IDE / Liferay Developer Studio / Bladeツールなどで、Liferay Workspaceを作成する。詳細に関してはユーザーガイドを参照してください。
- ${liferay_workspace_root}/modulesに移動、サービスビルダーでサービスを作成する。ここでは例として、
blade create -t service-builder -p com.liferay.test tasks
とコマンドを打って、サービスを生成する。 - tasksフォルダが生成されるので、
tasks/tasks-service/service.xml
を開く -
<entity local-service="true" name="Foo" remote-service="true" uuid="true">
の行のuuid="true"
をuuid="false"
に変更、フィールド定義を全て削除する。コードは以下のようになる
service.xml
<?xml version="1.0"?>
<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 7.0.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_7_0_0.dtd">
<service-builder package-path="com.liferay.test">
<namespace>FOO</namespace>
<!--<entity data-source="sampleDataSource" local-service="true" name="Foo" remote-service="false" session-factory="sampleSessionFactory" table="foo" tx-manager="sampleTransactionManager uuid="true"">-->
<entity local-service="true" name="Foo" remote-service="true" uuid="false">
</entity>
</service-builder>
-
gradle buildService
を実行すると、空のモデルでサービスが生成される。 - あとは普通のService Builderで生成されたサービスと同じく、*LocalServiceImpl.java, *ServiceImpl.javaにメソッドを書いて、再度
gradle buildService
を走らせることで、対応するインターフェースが自動生成される。