Service Builder是Liferay IDE(SDK)提供的一种代码生成方案,开发人员只需要编辑一个数据库的实体描述文件,即可根据本XML文件生成Spring层代码、Hibernate层代码、SQL、SQL索引创建文件、Spring和hibernate的配置文件等,可以大提高开发人员的效率。简单说就是根据数据库描述文件,生成service层和持久化层的代码,开发人员只需要关注控制层即可。
1、首先需要有一个Portlet的插件工程,创建方法,参考http://www.huqiwen.com/2012/09/01/liferay-6-1-development-studey-2-create-portlet-project/
2、打开Liferay IDE,点击工具栏中Liferay工具的中间按钮,New Liferay Service Builder,弹出的向导如下,填写相关信息,点击完成。
Plugin Project:将用于哪个工程,如果有多个工程,请看仔细。
Service file:数据库描述文件的文件名,使用向导不可更改(可以手动改,后面详述)
Package path:包名路径,这里是定义基础的包名路径,建议一般规则为:公司域名+portlet+功能模块名
Namespace:命名空间,如果没有指定数据库的表名,则会在前面添加上此命名空间。
Author:作者名,默认读取系统变量。
Include sample entiry in new file:在自动生成的xml文件中是否包含示例,如果是新手,建议打勾。
3、编辑service.xml文件。在liferay IDE里面提供了service的开视化编辑。简单介绍一下主要属性的含义。
Name:实例名称,就是通常的JavaBean的名称。
Local Service:本地服务,一般选中。
Remote Service:远程服务,用于为生成Web Service做支持,如果不需要不要选中。
Human Name:人性化名称。一般留空即可,此处的名字用于生成文档时使用,如果留空使用Name。
Table:数据库名称,如果不填写,使用Name。
Uuid:是否生成一个uuid的字段,具体的根据数据库设计情况而定。可以使用也可以不使用。推荐使用。
Uuid accessor:是否使用uuid存取实体,根据情况而定。可以使用也可以不使用。推荐使用。
Persistence Class:持久化类的名称,推荐留空,让自动生成。
Data source:数据源,一般留空。。
Session Factory:数据库会话工厂,一般留空。
TX Manager:事务管理,一般留空。
Cache enabled:开启缓存,推荐选中。
JSON enabled:开启JSON,生成的代码中包含实体的JSON序列化和反序列化,根据情况而定。如果不使用JSON,请不要勾选。
4、在Columns里面添加字段,填写字段名称,类型等。如果要使用特殊的数据库名称,或者字段有其他需求,请点开Columns,在下面逐个字段上修改。Db Name对应的为数据库的字段名称,其他一般留空即可。
5、Order,查询结果根据哪个字段排序列。
6、Finders:查询方法。service builder默认会生成基本的增删改查方法,如果有一些根据字段查询某些数据,返回的可以是一个实体也可以是一个List。
<finder name="userId" return-type="user">
<finder-column name="userId" />
</finder>
这个的意思是生成一个方法叫findyByUserId的方法,传入的参数是userId,返回的类型是User。(这个例子只是为说明,一般如果userId是主键,service builder生成的方法里面,不写此finder,已经包含此方法)
finder-column这里可以填写多个参数,return-type,如果是Collection则返回类型是List。
Finders方法,可以根据实际情况进行填写,对于使用finders仍不能满足的方法,后面详解。
7、点击ant里面servicer-builder按钮,等待Liferay进行代码生成。或者将可视化编辑器切换到Diagram,点击右键,service builder。
如果是第一次使用Service Builder,请按如下步骤操作。
1、WEB-INF目录下面找到service目录,点击右键Build Path-->Use as Source Folder。service包里面主要包括生成的代码里面的接口方法,方便我们进行跨工程的代码调用。src里面都 实现包。
2、Service Builder的使用,一般有两种方法。一种是获取一个Service。
CmsArticleLocalService cmsArticleServie = CmsArticleLocalServiceUtil.getService();
然后使用此xxService调用相关方法
一种是直接使用xxLocalServiceUtil调用相关方法。大部分情况下使用xxLocalServiceUtil进行方法调用。
3、创建一个modle实例一般使用如,xxLocalServiceUtil.createXX()方法。
虽然liferay自动生成的代码里面包含了常用方法,足以应付一般场景,但是有些特殊场景需要一些特殊的方法,如何添加自定义方法呢?
1、找到src下面和此service builder相关的的xxx.service.impl包,找到xxxLocalServiceImpl的文件,打开在此类里添加相关的自定义方法。
2、如果是要为modle添加自定义方法,请在xxx.modle.impl包里面的,xxImpl文件里面添加自定义方法。
3、修改完成后,再次执行Service Builder,会将这些方法自动的添加到其他相关接口、类里面。Liferay的Service Builder方法一般只允许修改上述两个类,其他的类一般不要修改,因为修改后如果再次执行service builder会被覆盖掉。
Liferay自动生成的代,如String字段,默认长度是75。如果有特殊的需求,可以在src/META-INF/portlet-model-hints.xml里面修改相应的字段映射长度。找到相应的实体,字段,如下:
<field name="InfoId" type="String" >
<hint name="max-length">300</hint>
</field>
这样就可以将InfoId的数据库字段长度定义为300。修改完成重新执行service-builder进行文件生成。
1、一个service.xml文件里面可以有多个实体名。
2、如果要建立多个service.xml文件,可以在WEB-IN目录下面建立一个文件夹,比如叫service-builder用来存储service.xml文件,不同的service.xml执行不同的命名,如User-Service.xml等。手动建立,不必使用向导。
3、如果按照步骤2操作,有多个service.xml文件,则不能执行ant里面的service-builder文件,因为ant只会寻找web-inf目录下面的services.xml文件。所以要在xx-service.xml文件里面切换到Diagram编辑模式,点击右键,build Service,这样会对当前XML文件进行构建。
4、即使使用了2、3的方法,也不要删除web-inf目录下面的service.xml文件,可以保留一份,不然最终部署后的web.xml描述文件里会少生成一些内容,导致插件工程不能正常运行。
5、同一个插件工程中,不同的xx-services.xml文件必须使用不同的包名,一个services.xml里面可以有多个实体,但不同的services.xml里面必须使用不同的包名,否则会导致生成的的spring配置文件出现覆盖情况。