Liferay 6.1开发学习(四):Service Builder

2012年09月11日 Liferay 评论 30 条 阅读 32,814 views 次

一、什么是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,弹出的向导如下,填写相关信息,点击完成。

Liferay Buider

Plugin Project:将用于哪个工程,如果有多个工程,请看仔细。

Service file:数据库描述文件的文件名,使用向导不可更改(可以手动改,后面详述)

Package path:包名路径,这里是定义基础的包名路径,建议一般规则为:公司域名+portlet+功能模块名

Namespace:命名空间,如果没有指定数据库的表名,则会在前面添加上此命名空间。

Author:作者名,默认读取系统变量。

Include sample entiry in new file:在自动生成的xml文件中是否包含示例,如果是新手,建议打勾。

3、编辑service.xml文件。在liferay IDE里面提供了service的开视化编辑。简单介绍一下主要属性的含义。

service XML文件

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配置文件出现覆盖情况。

用户头像

30 条留言  访客:21 条  博主:6 条   引用: 3 条

  1. avatar 被K喊母

    期待楼主更新。。。。。。。。。

  2. avatar fxllong262553

    很是期待楼主更新啊 ,强烈支持啊 ,一定要继续写下去啊,我感觉你这个是我见过写的最好的,也是最新的版本。很不错。 😉

  3. avatar 左手

    必须顶啊 这么好的文章. 支持继续写下去… 🙂

  4. 通过改impl类, build后,接口改变。build service的这种机制有哪些好处?

    • avatar 胡启稳

      简单的说就是可以方便跨portlet的接口调用,比如现在我有两个portlet工程,想在A工程里面调用B工程的业务代码,通过build service这种机制就可以实现

  5. 我遇到个问题,自己写的protlet新增后返回数据不显示,可是数据到数据库中了,要将这个portlet删掉重新加载才有用,这个是什么原因导致的呢,谢谢!

    • avatar 胡启稳

      这个应该不会有,你检查一下代码逻辑是不是哪个地方出问题了,这个问题我觉得和Liferay应该没有关系

      • avatar cied

        我试了你的那个工程,当全表扫描,不用条件查询时也是一样的问题,通过字段去查询就没有问题。。。

      • avatar cied

        问题解决了,liferay里用了hibernate的2级缓存,就是这个原因。。。

  6. 留言是种美德,写点什么… 😎 好文章!!!!!!!!!!

  7. avatar gaotong

    这个方法适用于其它数据库吗?不是liferay自己的数据库

    • avatar 胡启稳

      适用的,他的底层是使用的hibernate,liferay只是对hibernate进行了一层封装,并提供了一些代码生成方法

  8. 我不懂如何获取数据库数据?

  9. 用命令ant build-service生成modle,service等文件后,要修改那些文件才能访问我的数据库?

    • avatar 胡启稳

      不需要修改啥就可以访问了,生成之后,部署调用xxxLocalServiceUtil里面的方法香数据的增、删、改、查

  10. 为什么我的 WEB-INF 下面 没有service 目录啊?

  11. hi, 7、点击ant里面servicer-builder按钮,等待Liferay进行代码生成。或者将可视化编辑器切换到Diagram,点击右键,service builder。这一步我找不到”servicer-builder按钮”,具体在哪里呢?

  12. avatar amber_0123

    点builder services菜单,等待Liferay进行代码生成,可是一直不动。 是哪里没配置好吗。 service.xml已经弄好了啊。帮忙看下怎么回事啊。辛苦辛苦

  13. 楼主您好,首先您这一系列的文章写得真的很好,我想问一下,我按您这个步骤的时候,就在点击ant的servicebuild时候,报错,我在网上查The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files
    是java8的缘故?请问有什么好的解决方法吗?麻烦您了

  14. 写的很好 收益挺大 希望楼主坚持

  15. 能不用这种方式连接数据库么 ,用一些别的框架 如 mybatis 自己写连接

  16. avatar 桃子

    楼主您好,我执行完 servie builder之后,还是没有service 目录,这是什么原因啊

  17. avatar brother丶four

    写的很好,最近在学习

来自外部的引用: 3 条

  • Liferay6.1简单增删改查示例 | IT人生录
  • Liferay 6.1开发学习(十九):Liferay ServiceBuilder之自定义查询 | IT人生录
  • Liferay 6.1开发学习(十九):Liferay ServiceBuilder之自定义查询 | IT人生录

给我留言

Copyright © IT人生录 保留所有权利.   主题设计 知更鸟 滇ICP备16001547号-1

用户登录

分享到: