Liferay 6.1开发学习(四):Service Builder
一、什么是Service Builder?
Service Builder是Liferay IDE(SDK)提供的一种代码生成方案,开发人员只需要编辑一个数据库的实体描述文件,即可根据本XML文件生成Spring层代码、Hibernate层代码、SQL、SQL索引创建文件、Spring和hibernate的配置文件等,可以大提高开发人员的效率。简单说就是根据数据库描述文件,生成service层和持久化层的代码,开发人员只需要关注控制层即可。
二、Service Builder的使用
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生成代码的使用。
如果是第一次使用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配置文件出现覆盖情况。
期待楼主更新。。。。。。。。。
很是期待楼主更新啊 ,强烈支持啊 ,一定要继续写下去啊,我感觉你这个是我见过写的最好的,也是最新的版本。很不错。 😉
必须顶啊 这么好的文章. 支持继续写下去… 🙂
通过改impl类, build后,接口改变。build service的这种机制有哪些好处?
简单的说就是可以方便跨portlet的接口调用,比如现在我有两个portlet工程,想在A工程里面调用B工程的业务代码,通过build service这种机制就可以实现
我遇到个问题,自己写的protlet新增后返回数据不显示,可是数据到数据库中了,要将这个portlet删掉重新加载才有用,这个是什么原因导致的呢,谢谢!
这个应该不会有,你检查一下代码逻辑是不是哪个地方出问题了,这个问题我觉得和Liferay应该没有关系
我试了你的那个工程,当全表扫描,不用条件查询时也是一样的问题,通过字段去查询就没有问题。。。
问题解决了,liferay里用了hibernate的2级缓存,就是这个原因。。。
留言是种美德,写点什么… 😎 好文章!!!!!!!!!!
这个方法适用于其它数据库吗?不是liferay自己的数据库
适用的,他的底层是使用的hibernate,liferay只是对hibernate进行了一层封装,并提供了一些代码生成方法
我不懂如何获取数据库数据?
用命令ant build-service生成modle,service等文件后,要修改那些文件才能访问我的数据库?
不需要修改啥就可以访问了,生成之后,部署调用xxxLocalServiceUtil里面的方法香数据的增、删、改、查
为什么我的 WEB-INF 下面 没有service 目录啊?
要在第一次执行完 servie builder之后才有
hi, 7、点击ant里面servicer-builder按钮,等待Liferay进行代码生成。或者将可视化编辑器切换到Diagram,点击右键,service builder。这一步我找不到”servicer-builder按钮”,具体在哪里呢?
准确来说不是按钮了,是菜单
就点builder services菜单,貌似也行
点builder services菜单,等待Liferay进行代码生成,可是一直不动。 是哪里没配置好吗。 service.xml已经弄好了啊。帮忙看下怎么回事啊。辛苦辛苦
楼主您好,首先您这一系列的文章写得真的很好,我想问一下,我按您这个步骤的时候,就在点击ant的servicebuild时候,报错,我在网上查The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files
是java8的缘故?请问有什么好的解决方法吗?麻烦您了
楼主已经解决了。。我改成了jdk7u51
写的很好 收益挺大 希望楼主坚持
能不用这种方式连接数据库么 ,用一些别的框架 如 mybatis 自己写连接
楼主您好,我执行完 servie builder之后,还是没有service 目录,这是什么原因啊
写的很好,最近在学习
你好,我想请问一下,service bulider创建的服务需要自定义实体类该怎么添加?